给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编程起步(第七课)
Jan 10 Javascript
js 文件引入实现代码
Apr 23 Javascript
JS实现在Repeater控件中创建可隐藏区域的代码
Sep 16 Javascript
jQuery实现密保互斥问题解决方案
Aug 16 Javascript
将查询条件的input、select清空
Jan 14 Javascript
Node.js(安装,启动,测试)
Jun 09 Javascript
JavaScript设计模式之策略模式实例
Oct 10 Javascript
解决bootstrap导航栏navbar在IE8上存在缺陷的方法
Jul 01 Javascript
AngularJS入门教程之数据绑定用法示例
Nov 01 Javascript
jQuery实现的简单图片轮播效果完整示例
Feb 08 jQuery
微信小程序表单弹窗实例
Jul 19 Javascript
Vue实现动态添加或者删除对象和对象数组的操作方法
Sep 21 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
把从SQL中取出的数据转化成XMl格式
2006/10/09 PHP
简单的PHP缓存设计实现代码
2011/09/30 PHP
php Xdebug的安装与使用详解
2013/06/20 PHP
PHP中的Memcache详解
2014/04/05 PHP
php实现在站点里面添加邮件发送的功能
2020/04/28 PHP
基于jQueryUI和Corethink实现百度的搜索提示功能
2016/11/09 PHP
php 二维数组快速排序算法的实现代码
2017/10/17 PHP
PHP实现对图片的反色处理功能【测试可用】
2018/02/01 PHP
PHP number_format函数原理及实例解析
2020/07/14 PHP
JQuery中$之选择器用法介绍
2011/04/05 Javascript
基于JavaScript实现前端文件的断点续传
2016/10/17 Javascript
基于jquery实现五星好评
2017/11/18 jQuery
nodeJs爬虫的技术点总结
2018/05/13 NodeJs
浅谈VUE单页应用首屏加载速度优化方案
2018/08/28 Javascript
node.js实现为PDF添加水印的示例代码
2018/12/05 Javascript
详解vue 2.6 中 slot 的新用法
2019/07/09 Javascript
JS动态图片的实现方法完整示例
2020/01/13 Javascript
解决vuecli3中img src 的引入问题
2020/08/04 Javascript
JavaScript常用8种数组去重代码实例
2020/09/09 Javascript
Vue——解决报错 Computed property &quot;****&quot; was assigned to but it has no setter.
2020/12/19 Vue.js
[47:43]完美世界DOTA2联赛PWL S3 Magama vs GXR 第二场 12.19
2020/12/24 DOTA
Python脚本实现网卡流量监控
2015/02/14 Python
在Python中使用mechanize模块模拟浏览器功能
2015/05/05 Python
python3+PyQt5+Qt Designer实现堆叠窗口部件
2018/04/20 Python
Pycharm运行加载文本出现错误的解决方法
2019/06/27 Python
pandas进行时间数据的转换和计算时间差并提取年月日
2019/07/06 Python
Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法
2019/08/26 Python
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
国际商务专业学生个人的自我评价
2013/09/28 职场文书
俄语翻译实习生的自我评价分享
2013/11/06 职场文书
《地震中的父与子》教学反思
2014/04/10 职场文书
党员自我剖析材料(群众路线)
2014/10/06 职场文书
学校师德师风整改方案
2014/10/28 职场文书
2014年教学工作总结
2014/11/13 职场文书
运动会报道稿大全
2015/07/23 职场文书
Go语言中break label与goto label的区别
2021/04/28 Golang