给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+XML 操作
Sep 20 Javascript
jquery+json实现数据二级联动的方法
Nov 28 Javascript
Bootstrap每天必学之导航条(二)
Mar 01 Javascript
Ajax分页插件Pagination从前台jQuery到后端java总结
Jul 22 Javascript
react.js 获取真实的DOM节点实例(必看)
Apr 17 Javascript
JS中将多个逗号替换为一个逗号的实现代码
Jun 23 Javascript
基于JavaScript实现评论框展开和隐藏功能
Aug 25 Javascript
详解vue组件基础
May 04 Javascript
JS对象和字符串之间互换操作实例分析
Feb 02 Javascript
小程序采集录音并上传到后台
Nov 22 Javascript
小程序使用wxs解决wxml保留2位小数问题
Dec 13 Javascript
JavaScript浅层克隆与深度克隆示例详解
Sep 01 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/01/17 PHP
PHP Yaf框架的简单安装使用教程(推荐)
2016/06/08 PHP
PHP 中使用ajax时一些常见错误总结整理
2017/02/27 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
2017/05/24 PHP
jquery 应用代码 方便的排序功能
2010/02/06 Javascript
ASP.NET jQuery 实例3 (在TextBox里面阻止复制、剪切和粘贴事件)
2012/01/13 Javascript
jQuery之$(document).ready()使用介绍
2012/04/05 Javascript
使用GruntJS链接与压缩多个JavaScript文件过程详解
2013/08/02 Javascript
14款NodeJS Web框架推荐
2014/07/11 NodeJs
精通JavaScript的this关键字
2020/05/28 Javascript
JavaScript设计模式之单体模式全面解析
2016/09/09 Javascript
一个例子轻松学会Vue.js
2017/01/02 Javascript
浅析javaScript中的浅拷贝和深拷贝
2017/02/15 Javascript
vue.js分页中单击页码更换页面内容的方法(配合spring springmvc)
2018/02/10 Javascript
JS中双击和单击事件冲突的解决方法
2018/04/09 Javascript
JavaScript树的深度优先遍历和广度优先遍历算法示例
2018/07/30 Javascript
详解angular应用容器化部署
2018/08/14 Javascript
基于js Canvas实现二次贝塞尔曲线
2018/12/25 Javascript
详解用js代码触发dom事件的实现方案
2020/06/10 Javascript
vue中使用echarts的示例
2021/01/03 Vue.js
利用aardio给python编写图形界面
2017/08/21 Python
Python3实现计算两个数组的交集算法示例
2019/04/03 Python
Django多数据库的实现过程详解
2019/08/01 Python
pytorch::Dataloader中的迭代器和生成器应用详解
2020/01/03 Python
python 微信好友特征数据分析及可视化
2020/01/07 Python
css3背景图片透明叠加属性cross-fade简介及用法实例
2013/01/08 HTML / CSS
Gap加拿大官网:Gap Canada
2017/08/24 全球购物
英国助听器购物网站:Hearing Direct
2018/08/21 全球购物
含精油的天然有机化妆品:Indemne
2019/08/27 全球购物
财务人员求职自荐书范文
2014/02/10 职场文书
群众路线教育实践活动学习笔记
2014/11/05 职场文书
2015年检察院个人工作总结
2015/05/20 职场文书
简单且有用的Python数据分析和机器学习代码
2021/07/02 Python
JavaScript的Set数据结构详解
2022/02/18 Javascript
Spring Boot接口定义和全局异常统一处理
2022/04/20 Java/Android
第四次工业革命,打工人与机器人的竞争
2022/04/21 数码科技