给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 相关文章推荐
jQuery 使用手册(二)
Sep 23 Javascript
JQuery实现简单时尚快捷的气泡提示插件
Dec 20 Javascript
巧用局部变量提升javascript性能
Feb 24 Javascript
JavaScript中使用stopPropagation函数停止事件传播例子
Aug 27 Javascript
浅谈jQuery异步对象(XMLHttpRequest)
Nov 17 Javascript
JS长整型精度问题实例分析
Jan 13 Javascript
javascript和jquery实现用户登录验证
May 04 Javascript
深入浅出讲解ES6的解构
Aug 03 Javascript
微信小程序 require机制详解及实例代码
Dec 14 Javascript
jquery在启动页面时,自动加载数据的实例
Jan 22 jQuery
解决淘宝cnpm 安装后cnpm不是内部或外部命令的问题
May 17 Javascript
electron 安装,调试,打包的具体使用
Nov 06 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
Dedecms V3.1 生成HTML速度的优化办法
2007/03/18 PHP
PHP中将数组转成XML格式的实现代码
2011/08/08 PHP
PHP判断是否连接上网络的方法
2015/07/01 PHP
php mongodb操作类 带几个简单的例子
2016/08/25 PHP
PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】
2019/06/14 PHP
javascript 基础篇2 数据类型,语句,函数
2012/03/14 Javascript
JavaScript/Js脚本处理html元素的自定义属性解析(亲测兼容Firefox与IE)
2013/11/25 Javascript
iframe的onreadystatechange事件在firefox下的使用
2014/04/16 Javascript
Egret引擎开发指南之发布项目
2014/09/03 Javascript
JS是按值传递还是按引用传递
2015/01/30 Javascript
jquery把int类型转换成字符串类型的方法
2016/10/07 Javascript
JS实现仿饿了么在浏览器标签页失去焦点时网页Title改变
2017/06/01 Javascript
vue如何进行动画的封装
2018/09/26 Javascript
如何为vue的项目添加单元测试
2018/12/19 Javascript
vue动态路由:路由参数改变,视图不更新问题的解决
2019/11/05 Javascript
解决vue单页面应用打包后相对路径、绝对路径相关问题
2020/08/14 Javascript
vue使用video插件vue-video-player详解
2020/10/23 Javascript
[00:30]塑造者的传承礼包-戴泽“暗影之焰”套装展示视频
2014/04/04 DOTA
基于Python代码编辑器的选用(详解)
2017/09/13 Python
PyQt5每天必学之创建窗口居中效果
2018/04/19 Python
浅谈python3.x pool.map()方法的实质
2019/01/16 Python
如何基于python测量代码运行时间
2019/12/25 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
2020/09/14 Python
Python 实现进度条的六种方式
2021/01/06 Python
使用HTML5和CSS3表单验证功能
2017/05/05 HTML / CSS
css3 column实现卡片瀑布流布局的示例代码
2018/06/22 HTML / CSS
澳大利亚儿童精品仓库:Goo & Co.
2019/06/20 全球购物
学生干部学习的自我评价
2014/02/18 职场文书
超市国庆节促销方案
2014/02/20 职场文书
2014大四本科生自我鉴定总结
2014/10/04 职场文书
一次性工伤赔偿协议书范本
2014/11/25 职场文书
2014年优秀党员材料
2014/12/18 职场文书
2015年政风行风工作总结
2015/04/21 职场文书
开业庆典嘉宾致辞
2015/08/01 职场文书
python opencv检测直线 cv2.HoughLinesP的实现
2021/06/18 Python
海贼王十大逆天果实 魂魂果实上榜,岩浆果实攻击力最强
2022/03/18 日漫