给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 距离某一时间点时间是多少实现代码
Oct 14 Javascript
jquery通过select列表选择框对表格数据进行过滤示例
May 07 Javascript
node.js中的events.EventEmitter.listenerCount方法使用说明
Dec 08 Javascript
JavaScript提升性能的常用技巧总结【经典】
Jun 20 Javascript
Node.js编写CLI的实例详解
May 17 Javascript
SpringMVC+bootstrap table实例详解
Jun 02 Javascript
基于jQuery对象和DOM对象和字符串之间的转化实例
Aug 08 jQuery
浅谈gulp创建完整的项目流程
Dec 20 Javascript
AngularJS使用ui-route实现多层嵌套路由的示例
Jan 10 Javascript
jsonp跨域获取百度联想词的方法分析
May 13 Javascript
js简单遍历获取对象中的属性值的方法示例
Jun 19 Javascript
javascript实现评分功能
Jun 24 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 curl post 时出现的问题解决
2014/01/30 PHP
CI框架给视图添加动态数据
2014/12/01 PHP
PHP随手笔记整理之PHP脚本和JAVA连接mysql数据库
2015/11/25 PHP
解析WordPress中函数钩子hook的作用及基本用法
2015/12/22 PHP
php 数组随机取值的简单实例
2016/05/23 PHP
php实现批量修改文件名称的方法
2016/07/23 PHP
让回调函数 showResponse 也带上参数的代码
2007/08/13 Javascript
jquery json 实例代码
2010/12/02 Javascript
jquery DIV撑大让滚动条滚到最底部代码
2013/06/06 Javascript
javascript按位非运算符的使用方法
2013/11/14 Javascript
jquery读取xml文件实现省市县三级联动的方法
2015/05/29 Javascript
jquery实现不包含当前项的选择器实例
2015/06/25 Javascript
js中获取jsp表单中radio类型的值简单实例
2016/08/15 Javascript
在Vue组件上动态添加和删除属性方法
2018/02/23 Javascript
Vue表单类的父子组件数据传递示例
2018/05/03 Javascript
Bootstrap Table列宽拖动的方法
2018/08/15 Javascript
vue中rem的配置的方法示例
2018/08/30 Javascript
前端使用crypto.js进行加密的函数代码
2020/08/16 Javascript
在Python的web框架中配置app的教程
2015/04/30 Python
详解python的webrtc库实现语音端点检测
2017/05/31 Python
Python装饰器用法实例总结
2018/02/07 Python
PyQt5 QSerialPort子线程操作的实现
2018/04/21 Python
详解Numpy中的广播原则/机制
2018/09/20 Python
详解Matplotlib绘图之属性设置
2019/08/23 Python
Python3 pywin32模块安装的详细步骤
2020/05/26 Python
Python如何进行时间处理
2020/08/06 Python
非常漂亮的CSS3百叶窗焦点图动画
2016/02/24 HTML / CSS
浅谈Html5移动端ios/Android兼容性总结
2018/06/01 HTML / CSS
FitFlop澳大利亚官网:英国符合人体工学的鞋类品牌
2017/06/05 全球购物
员工保密承诺书
2014/05/28 职场文书
简易版租房协议书范本
2014/10/13 职场文书
春秋淹城导游词
2015/02/11 职场文书
学雷锋广播稿大全
2015/08/19 职场文书
用Python制作灯光秀短视频的思路详解
2021/04/13 Python
Python爬虫框架之Scrapy中Spider的用法
2021/06/28 Python
排查并解决MySQL生产库内存使用率高的报警
2022/04/11 MySQL