给Function做的OOP扩展


Posted in Javascript onMay 07, 2009
// 下面是OOP用的方法 
// 这样很猥琐……因为JS并不是OOP语言…… 
// 但伟大的伍迷指引我们来这么干 
// Belldandy会保佑用这些方法来OOP的人的…… 
Function.prototype.inherits = function(base){ 
//派生关系,保留了prototype 
//只支持单派生 
this.prototype = new base(); 
return this; 
} 
Function.prototype.create = function(){ 
//类的创建器,和用new等价 
//JS不支持在构造器用call和apply,所以…… 
//Belldandy啊,感谢你告诉我怎么解决这个问题啊…… 
var _args = []; 
for(i=0;i<arguments.length;i++) _args.push('arguments['+i+']'); return eval('new this('+_args.join(',')+')'); //eval都用上了……Bell啊,下次给个好点的主意吧…… 
} 
Function.prototype.pin = function(pinner,args){ 
// 注册服务,或者叫“pin”服务 
// EventManager就可以这么干 
// 你也可以认为实现了有默认实现的接口…… 
// 例如,pin EventManager就可以这样:Class.pin(core.WvwntManager) 
args = args || []; 
pinner.apply(this.prototype,args); 
return this; 
} 
Function.prototype.method = function(name, f) { //添加方法,高效 
if (!(f instanceof Function)) throw new Error('方法绑定无效,得到类型'+typeof f+';期待为function'); 
this.prototype[name] = f; 
return this 
} 
Function.prototype.property = function(name, localName, getter, setter) { //添加属性,可自定getter、setter 
if (!name || !name instanceof String) throw new EnvironmentException('定义属性时,属性名没有定义,或者不是字符串'); 
if (!localName || !localName instanceof String) localName = '_local_' + name; 
if(getter instanceof Function) { 
this.prototype['_belldandy_get_'+name] = getter; 
} 
if(setter instanceof Function){ 
this.prototype['_belldandy_set_'+name] = setter; 
} 
this.prototype[name] = new Function("value , force"," \ 
if (!value && !force) { \ 
if (!this['"+'_belldandy_get_'+name+"'] || !this['"+'_belldandy_get_'+name+"'] instanceof Function) \ 
return this['"+localName+"']; /* 没有设置getter时 */\ 
else \ 
return this['"+'_belldandy_get_'+name+"'].call(this); \ 
} else { \ 
if (!this['"+'_belldandy_set_'+name+"'] || !this['"+'_belldandy_set_'+name+"'] instanceof Function) \ 
this['"+localName+"'] = value; \ 
else\ 
this['"+'_belldandy_set_'+name+"'].call(this, value); \ 
return this\ 
}") //Belldandy啊,饶恕我吧,虽然这样不产生闭包 
return this; 
} 
Function.prototype.static = function(name,value){ //静态特征,包括属性和方法 
this[name] = value; 
return this; 
}

使用效果如下:
function foo() { }; 
foo 
.property('a', '_a') 
.property('b', '_b', function() { return this._b + '.' }) 
.method('f', function() { dwn(this.a()) }); 
function bar(x,y){this.x = x;this.y = y;}; 
with(bar){ 
inherits(foo) 
method('g',function(){dwn(this.a()+'-'+this.b())}) 
} var f = new foo(); 
f.a(1); 
f.b(2); 
dwn(f.a()); 
dwn(f.b()); 
f.f(); 
b = bar.create(1,2); 
b.a(4); 
b.b(5); 
dwn(b.x+','+b.y); 
b.g(); 
//dwn自己参阅月影的书
Javascript 相关文章推荐
利用javascript查看html源文件
Nov 08 Javascript
javascript 浏览器判断 绑定事件 arguments 转换数组 数组遍历
Jul 06 Javascript
可以用鼠标拖动的DIV实现思路及代码
Oct 21 Javascript
基于JS实现翻书效果的页面切换样式
Feb 16 Javascript
Bootstrap模态框案例解析
Mar 05 Javascript
JavaScript设计模式之代理模式详解
Jun 09 Javascript
微信小程序开发中的疑问解答汇总
Jul 03 Javascript
JS传播事件、取消事件默认行为、阻止事件传播详解
Aug 14 Javascript
jQuery实现的form转json经典示例
Oct 10 jQuery
深入浅出webpack之externals的使用
Dec 04 Javascript
解决Vue使用bus总线时,第一次路由跳转时数据没成功传递问题
Jul 28 Javascript
react中hook介绍以及使用教程
Dec 11 Javascript
js arguments.callee的应用代码
May 07 #Javascript
javascript 有用的脚本函数
May 07 #Javascript
JavaScript的parseInt 进制问题
May 07 #Javascript
日期 时间js控件
May 07 #Javascript
关于viewport,Ext.panel和Ext.form.panel的关系
May 07 #Javascript
jQuery 1.2.x 升? 1.3.x 注意事项
May 06 #Javascript
jQuery select的操作实现代码
May 06 #Javascript
You might like
探讨fckeditor在Php中的配置详解
2013/06/08 PHP
在Mac上编译安装PHP7的开发环境
2015/07/28 PHP
程序员的表白神器“520”大声喊出来
2016/05/20 PHP
php curl获取https页面内容,不直接输出返回结果的设置方法
2019/01/15 PHP
jquery中通过过滤器获取表单元素的实现代码
2011/07/05 Javascript
如何获取JQUERY AJAX返回的JSON结果集实现代码
2012/12/10 Javascript
JS 跳转页面延迟2种方法
2013/03/29 Javascript
Jquery动态改变图片IMG的src地址示例
2013/06/25 Javascript
node.js中的http.response.removeHeader方法使用说明
2014/12/14 Javascript
基于Css3和JQuery实现打字机效果
2015/08/11 Javascript
简单的JS时钟实例讲解
2016/01/13 Javascript
基于javascript实现简单的抽奖系统
2020/04/15 Javascript
利用Angularjs中模块ui-route管理状态的方法
2016/12/27 Javascript
Vue.js开发环境快速搭建教程
2017/03/17 Javascript
JS实现的透明度渐变动画效果示例
2018/04/28 Javascript
详解js中let与var声明变量的区别
2020/04/05 Javascript
开源一个微信小程序仪表盘组件过程解析
2019/07/30 Javascript
vue实现列表拖拽排序的功能
2020/11/02 Javascript
vue基于Echarts的拖拽数据可视化功能实现
2020/12/04 Vue.js
ES5和ES6中类的区别总结
2020/12/21 Javascript
python中os操作文件及文件路径实例汇总
2015/01/15 Python
python实现稀疏矩阵示例代码
2017/06/09 Python
OpenCV2.3.1+Python2.7.3+Numpy等的配置解析
2018/01/05 Python
python如何把嵌套列表转变成普通列表
2018/03/20 Python
Python实现接受任意个数参数的函数方法
2018/04/21 Python
python绘制中国大陆人口热力图
2018/11/07 Python
对Python的zip函数妙用,旋转矩阵详解
2018/12/13 Python
关于不懂Chromedriver如何配置环境变量问题解决方法
2019/06/12 Python
Python批量启动多线程代码实例
2020/02/18 Python
跑鞋、网球鞋、网球拍、服装及装备:Holabird Sports
2016/09/19 全球购物
德国高端单身人士交友网站:ElitePartner
2018/12/02 全球购物
旷课检讨书3000字
2014/02/04 职场文书
2015清明节祭奠英烈寄语大全
2015/03/04 职场文书
狼牙山五壮士观后感
2015/06/09 职场文书
医学会议开幕词
2016/03/03 职场文书
MySQL外键约束(Foreign Key)案例详解
2022/06/28 MySQL