给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 相关文章推荐
javascript下IE与FF兼容函数收集
Sep 17 Javascript
js监听表单value的修改同步问题,跨浏览器支持
Dec 31 Javascript
在JS中如何调用JSP中的变量
Jan 22 Javascript
详谈JavaScript内存泄漏
Nov 14 Javascript
jQuery中:password选择器用法实例
Jan 03 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
Mar 13 Javascript
关于javascript作用域的常见面试题分享
Jun 18 Javascript
JS中用EL表达式获取上下文参数值的方法
Mar 28 Javascript
webpack热模块替换(HMR)/热更新的方法
Apr 05 Javascript
Vue Promise的axios请求封装详解
Aug 13 Javascript
一文搞懂ES6中的Map和Set
May 20 Javascript
快速对接payjq的个人微信支付接口过程解析
Aug 15 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中explode与split的区别介绍
2012/10/03 PHP
php实现无限级分类查询(递归、非递归)
2016/03/10 PHP
tp5(thinkPHP5)操作mongoDB数据库的方法
2018/01/20 PHP
php根据地址获取百度地图经纬度的实例方法
2019/09/03 PHP
Javascript匿名函数的一种应用 代码封装
2010/06/27 Javascript
使用Json比用string返回数据更友好,也更面向对象一些
2011/09/13 Javascript
查看源码的工具 学习jQuery源码不错的工具
2011/12/26 Javascript
node.js中的buffer.toString方法使用说明
2014/12/14 Javascript
全面解析Bootstrap表单使用方法(表单控件状态)
2015/11/24 Javascript
jQuery validate验证插件使用详解
2016/05/11 Javascript
AngularJS指令用法详解
2016/11/02 Javascript
浅析java线程中断的办法
2018/07/29 Javascript
浅谈Angular 观察者模式理解
2018/11/01 Javascript
vue+echarts实现可拖动节点的折线图(支持拖动方向和上下限的设置)
2019/04/12 Javascript
jquery实现动态创建form并提交的方法示例
2019/05/27 jQuery
vue + typescript + 极验登录验证的实现方法
2019/06/27 Javascript
jquery实现异步文件上传ajaxfileupload.js
2020/10/23 jQuery
TypeScript魔法堂之枚举的超实用手册
2020/10/29 Javascript
python抓取网页时字符集转换问题处理方案分享
2014/06/19 Python
Python实现计算最小编辑距离
2016/03/17 Python
在python的类中动态添加属性与生成对象
2016/09/17 Python
Python实现解析Bit Torrent种子文件内容的方法
2017/08/29 Python
Python中列表list以及list与数组array的相互转换实现方法
2017/09/22 Python
tensorflow实现逻辑回归模型
2018/09/08 Python
Python中的正则表达式与JSON数据交换格式
2019/07/03 Python
基于Python实现剪切板实时监控方法解析
2019/09/11 Python
俄罗斯三星品牌商店:GalaxyStore
2020/11/04 全球购物
食品销售计划书
2014/04/26 职场文书
2014年社区民政工作总结
2014/12/02 职场文书
入党函调证明材料
2014/12/24 职场文书
应届毕业生求职简历自我评价
2015/03/02 职场文书
2015年圣诞节活动总结
2015/03/24 职场文书
培训通知
2015/04/17 职场文书
队名及霸气口号大全
2015/12/25 职场文书
《卧薪尝胆》读后感3篇
2019/12/26 职场文书
CSS预处理框架——Stylus
2021/04/21 HTML / CSS