给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 相关文章推荐
发现的以前不知道的函数
Sep 19 Javascript
基于JQuery实现的图片自动进行缩放和裁剪处理
Jan 31 Javascript
js获取上传文件大小示例代码
Apr 10 Javascript
利用js实现禁止复制文本信息
Jun 03 Javascript
javascript中mouseover、mouseout使用详解
Jul 19 Javascript
javascript类型系统——日期Date对象全面了解
Jul 13 Javascript
vue.js绑定class和style样式(6)
Dec 09 Javascript
深入理解Javascript中的作用域链和闭包
Apr 25 Javascript
详解react如何在组件中获取路由参数
Jun 15 Javascript
vue数组对象排序的实现代码
Jun 20 Javascript
微信小程序分享小程序码的生成(带参数)以及参数的获取
Mar 25 Javascript
Openlayers+EasyUI Tree动态实现图层控制
Sep 28 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单例模式实现(对象只被创建一次)
2012/12/05 PHP
php addslashes 利用递归实现使用反斜线引用字符串
2013/08/05 PHP
thinkphp在模型中自动完成session赋值示例代码
2014/09/09 PHP
Laravel实现用户注册和登录
2015/01/23 PHP
Yii2超好用的日期和时间组件(值得收藏)
2016/05/05 PHP
JS 页面内容搜索,类似于 Ctrl+F功能的实现代码
2007/08/13 Javascript
javascript实现的网页局布刷新效果
2008/12/01 Javascript
js data日期初始化的5种方法
2013/12/29 Javascript
jquery地址栏链接与a标签链接匹配之特效代码总结
2015/08/24 Javascript
基于Flowplayer打造一款免费的WEB视频播放器附源码
2015/09/06 Javascript
jQuery插件imgPreviewQs实现上传图片预览
2016/01/15 Javascript
JS实现1000以内被3或5整除的数字之和
2016/02/18 Javascript
javascript实现页面滚屏效果
2017/01/17 Javascript
Vue 按键修饰符处理事件的方法
2018/05/04 Javascript
Angular动画实现的2种方式以及添加购物车动画实例代码
2018/08/09 Javascript
在element-ui的select下拉框加上滚动加载
2019/04/18 Javascript
JS中的一些常用的函数式编程术语
2019/06/15 Javascript
ionic4+angular7+cordova上传图片功能的实例代码
2019/06/19 Javascript
vue基本使用--refs获取组件或元素的实例
2019/11/07 Javascript
python读写ini配置文件方法实例分析
2015/06/30 Python
对变量赋值的理解--Pyton中让两个值互换的实现方法
2017/11/29 Python
python实现感知器算法详解
2017/12/19 Python
python之pandas用法大全
2018/03/13 Python
tensorflow1.0学习之模型的保存与恢复(Saver)
2018/04/23 Python
解决python3 urllib 链接中有中文的问题
2018/07/16 Python
pycharm安装和首次使用教程
2018/08/27 Python
详解Python Matplot中文显示完美解决方案
2019/03/07 Python
Python实现蒙特卡洛算法小实验过程详解
2019/07/12 Python
django实现模型字段动态choice的操作
2020/04/01 Python
使用Python内置模块与函数进行不同进制的数的转换
2020/04/26 Python
python 浮点数四舍五入需要注意的地方
2020/08/18 Python
Django windows使用Apache实现部署流程解析
2020/10/12 Python
大学生社会实践方案
2014/05/11 职场文书
乡镇干部先进性教育活动个人整改措施
2014/09/16 职场文书
2014年小学班主任工作总结
2014/11/08 职场文书
投诉信回复范文
2015/07/03 职场文书