给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 相关文章推荐
Jquery submit()无法提交问题
Apr 21 Javascript
jQuery查询数据返回object和字符串影响原因是什么
Aug 09 Javascript
客户端js性能优化小技巧整理
Nov 05 Javascript
jQuery判断checkbox(复选框)是否被选中以及全选、反选实现代码
Feb 21 Javascript
javascript编写实用的省市选择器
Feb 12 Javascript
探讨跨域请求资源的几种方式(总结)
Dec 02 Javascript
vue2.0结合DataTable插件实现表格动态刷新的方法详解
Mar 17 Javascript
angular4中关于表单的校验示例
Oct 16 Javascript
vue学习教程之带你一步步详细解析vue-cli
Dec 26 Javascript
纯JS实现可用于页码更换的飞页特效示例
May 21 Javascript
记React connect的几种写法(小结)
Sep 18 Javascript
VeeValidate 的使用场景以及配置详解
Jan 11 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
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
2010/04/07 PHP
php使用递归计算文件夹大小
2014/12/24 PHP
使用jQuery轻松实现Ajax的实例代码
2010/08/16 Javascript
jquery+json实现数据列表分页示例代码
2013/11/15 Javascript
jQuery中数据缓存$.data的用法及源码完全解析
2016/04/29 Javascript
玩转JavaScript OOP - 类的实现详解
2016/06/08 Javascript
AngularJS 过滤与排序详解及实例代码
2016/09/14 Javascript
KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法
2016/10/05 Javascript
js实现html table 行,列锁定的简单实例
2016/10/13 Javascript
canvas绘制七巧板
2017/02/03 Javascript
源码分析Vue.js的监听实现教程
2017/04/23 Javascript
angular2中router路由跳转navigate的使用与刷新页面问题详解
2017/05/07 Javascript
jQuery实现键盘回车搜索功能
2017/07/25 jQuery
微信小程序 同步请求授权的详解
2017/08/04 Javascript
vue.js高德地图实现热点图代码实例
2019/04/18 Javascript
深入解析vue 源码目录及构建过程分析
2019/04/24 Javascript
vue实现分页栏效果
2019/06/28 Javascript
vue 集成 vis-network 实现网络拓扑图的方法
2019/08/07 Javascript
详解ES6中class的实现原理
2020/10/03 Javascript
Antd的table组件表格的序号自增操作
2020/10/27 Javascript
Vue中computed和watch有哪些区别
2020/12/19 Vue.js
python字符串对其居中显示的方法
2015/07/11 Python
python中将函数赋值给变量时需要注意的一些问题
2017/08/18 Python
Python模拟三级菜单效果
2017/09/11 Python
用Python登录好友QQ空间点赞的示例代码
2017/11/04 Python
python 通过字符串调用对象属性或方法的实例讲解
2018/04/21 Python
python写入并获取剪切板内容的实例
2018/05/31 Python
使用Python进行QQ批量登录的实例代码
2018/06/11 Python
AmazeUI折叠式卡片布局,整合内容列表、表格组件实现
2020/08/20 HTML / CSS
前台文员的岗位职责
2013/11/14 职场文书
硕士学位申请报告
2015/05/15 职场文书
患者身份识别制度
2015/08/06 职场文书
《分一些蚊子进来》读后感3篇
2020/01/09 职场文书
解决pytorch 损失函数中输入输出不匹配的问题
2021/06/05 Python
MySQL七种JOIN类型小结
2021/10/24 MySQL
instantclient客户端 连接oracle数据库
2022/04/26 Oracle