给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 相关文章推荐
在 IE 中调用 javascript 打开 Excel 表
Dec 21 Javascript
基于JQuery的Pager分页器实现代码
Jul 17 Javascript
JavaScript访问样式表代码
Oct 15 Javascript
关于JavaScript定义类和对象的几种方式
Nov 09 Javascript
js string 转 int 注意的问题小结
Aug 15 Javascript
MVC Ajax Helper或Jquery异步加载部分视图
Nov 29 Javascript
jQuery进行组件开发完整实例
Dec 15 Javascript
jquery无法为动态生成的元素添加点击事件的解决方法(推荐)
Dec 26 Javascript
jquery中$.fn和图片滚动效果实现的必备知识总结
Apr 21 jQuery
JavaScript 获取元素在父节点中的下标(推荐)
Jun 28 Javascript
使用vue-router设置每个页面的title方法
Feb 11 Javascript
深入浅析React中diff算法
May 19 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
PHP获取url的函数代码
2011/08/02 PHP
PHP5中Cookie与 Session使用详解
2013/04/30 PHP
使用PHP获取当前url路径的函数以及服务器变量
2013/06/29 PHP
PHP设置图片文件上传大小的具体实现方法
2013/10/11 PHP
php+redis消息队列实现抢购功能
2018/02/08 PHP
Nigma vs Alliance BO5 第二场2.14
2021/03/10 DOTA
基于jQuery的树控件实现代码(asp.net+json)
2010/07/11 Javascript
获得所有表单值的JQuery实现代码[IE暂不支持]
2012/05/24 Javascript
jquery 插件开发 extjs中的extend用法小结
2013/01/04 Javascript
关于JavaScript数组你所不知道的3件事
2016/08/24 Javascript
JavaScript和JQuery获取DIV值的方法示例
2017/03/07 Javascript
详解利用jsx写vue组件的方法示例
2017/07/17 Javascript
详解webpack-dev-server的简单使用
2018/04/02 Javascript
基于vue中keep-alive缓存问题的解决方法
2018/09/21 Javascript
JS实现十分钟倒计时代码实例
2018/10/18 Javascript
JS实现随机生成10个手机号的方法示例
2018/12/07 Javascript
使用pm2部署node生产环境的方法步骤
2019/03/09 Javascript
微信小程序学习笔记之表单提交与PHP后台数据交互处理图文详解
2019/03/28 Javascript
五分钟搞懂Vuex实用知识(小结)
2019/08/12 Javascript
微信小程序HTTP请求从0到1封装
2019/09/09 Javascript
15分钟学会vue项目改造成SSR(小白教程)
2019/12/17 Javascript
JavaScript随机数的组合问题案例分析
2020/05/16 Javascript
vue 解决provide和inject响应的问题
2020/11/12 Javascript
Python自动化运维和部署项目工具Fabric使用实例
2016/09/18 Python
python验证码识别教程之利用滴水算法分割图片
2018/06/05 Python
洲际酒店集团美国官网:IHG美国
2017/11/16 全球购物
荷兰男士时尚网上商店:Suitable
2017/12/25 全球购物
澳大利亚网上玩具商店:Mr Toys Toyworld
2018/03/25 全球购物
DERMAdoctor官网:美国著名皮肤护理品牌
2019/07/06 全球购物
介绍一下gcc特性
2012/01/20 面试题
标准离婚协议书(2014版)
2014/10/05 职场文书
银行稽核岗位职责
2015/04/13 职场文书
2015年统战工作总结
2015/05/19 职场文书
springboot利用redis、Redisson处理并发问题的操作
2021/06/18 Java/Android
部分武汉产收音机展览
2022/04/07 无线电
使用pd.merge表连接出现多余行的问题解决
2022/06/16 Python