给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 相关文章推荐
脚本吧 - 幻宇工作室用到js,超强推荐share.js
Dec 23 Javascript
Extjs Gird 支持中文拼音排序实现代码
Apr 15 Javascript
javascript中键盘事件用法实例分析
Jan 30 Javascript
jquery.mobile 共同布局遇到的问题小结
Feb 10 Javascript
详解jQuery中的元素的属性和相关操作
Aug 14 Javascript
深入学习JavaScript的AngularJS框架中指令的使用方法
Mar 05 Javascript
jQuery Validate验证表单时多个name相同的元素只验证第一个的解决方法
Dec 24 Javascript
高效的jQuery代码编写技巧总结
Feb 22 Javascript
vue项目如何刷新当前页面的方法
May 18 Javascript
angular 内存溢出的问题解决
Jul 12 Javascript
微信小程序如何使用云开发
May 17 Javascript
JavaScript 语句之常用 for 循环详解
Mar 29 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中操作MySQL数据库的一些要注意的问题
2006/10/09 PHP
php 将bmp图片转为jpg等其他任意格式的图片
2009/06/29 PHP
PHP file_exists问题杂谈
2012/05/07 PHP
ubuntu10.04配置 nginx+php-fpm模式的详解
2013/06/03 PHP
php数组转换js数组操作及json_encode的用法详解
2013/10/26 PHP
PHP输出两个数字中间有多少个回文数的方法
2015/03/23 PHP
php通过两层过滤获取留言内容的方法
2016/07/11 PHP
PHP7新增运算符用法实例分析
2016/09/26 PHP
PHP 观察者模式深入理解与应用分析
2019/09/25 PHP
jQuery 定时局部刷新(setInterval)
2010/11/19 Javascript
基于jquery的图片幻灯展示源码
2012/07/15 Javascript
学习JavaScript设计模式之策略模式
2016/01/12 Javascript
从零学习node.js之express入门(六)
2017/02/25 Javascript
微信小程序开发中的疑问解答汇总
2017/07/03 Javascript
VUEJS 2.0 子组件访问/调用父组件的实例
2018/02/10 Javascript
Seajs源码详解分析
2019/04/02 Javascript
nodejs中request库使用HTTPS代理的方法
2019/04/30 NodeJs
浅谈webpack构建工具配置和常用插件总结
2020/05/11 Javascript
关于vue的列表图片选中打钩操作
2020/09/09 Javascript
html5以及jQuery实现本地图片上传前的预览代码实例讲解
2021/03/01 jQuery
Python3使用requests发闪存的方法
2016/05/11 Python
R vs. Python 数据分析中谁与争锋?
2017/10/18 Python
Python数据分析之获取双色球历史信息的方法示例
2018/02/03 Python
Python 使用类写装饰器的小技巧
2018/09/30 Python
python3的输入方式及多组输入方法
2018/10/17 Python
pytorch: Parameter 的数据结构实例
2019/12/31 Python
Python内置异常类型全面汇总
2020/05/28 Python
Html5页面二次分享的实现
2018/07/30 HTML / CSS
英国打印机墨盒销售网站:Ink Factory
2019/10/07 全球购物
PHP解析URL是哪个函数?怎么用?
2013/05/09 面试题
如何在Cookie里面保存Unicode和国际化字符
2013/05/25 面试题
节约每一滴水演讲稿
2014/09/09 职场文书
教师教育教学随笔
2015/08/15 职场文书
python 逐步回归算法
2021/04/06 Python
如何制作自己的原生JavaScript路由
2021/05/05 Javascript
MySQL表字段数量限制及行大小限制详情
2022/07/23 MySQL