给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 相关文章推荐
基于json的jquery地区联动效果代码
Jul 06 Javascript
JavaScript中逗号运算符介绍及使用示例
Mar 13 Javascript
JS禁用页面上所有控件的实现方法(附demo源码下载)
Dec 17 Javascript
JavaScript数组的栈方法与队列方法详解
May 26 Javascript
微信小程序 less文件编译成wxss文件实现办法
Dec 05 Javascript
详解在vue-cli中引用jQuery、bootstrap以及使用sass、less编写css
Nov 08 jQuery
vue-router配合ElementUI实现导航的实例
Feb 11 Javascript
在Vue组件上动态添加和删除属性方法
Feb 23 Javascript
vue项目中使用scss的方法步骤
May 16 Javascript
微信小程序如何实现在线客服功能
Oct 16 Javascript
基于Nuxt.js项目的服务端性能优化与错误检测(容错处理)
Oct 23 Javascript
JS面向对象编程基础篇(三) 继承操作实例详解
Mar 03 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 数组二分法查找函数代码
2010/02/16 PHP
PHP 删除一个目录及目录下的所有文件的函数代码
2010/05/26 PHP
PHP简洁函数小结
2011/08/12 PHP
PHP使用自定义方法实现数组合并示例
2016/07/07 PHP
Laravel5权限管理方法详解
2016/07/26 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
2018/10/14 PHP
JS(jQuery)实现聊天接收到消息语言自动提醒功能详解【提示“您有新的消息请注意查收”】
2019/04/16 PHP
jQuery的DOM操作之删除节点示例
2014/01/03 Javascript
jquery获取html元素的绝对位置和相对位置的方法
2014/06/20 Javascript
jQuery实现限制textarea文本框输入字符数量的方法
2015/05/28 Javascript
JCrop+ajaxUpload 图像切割上传的实例代码
2016/07/20 Javascript
AngularJS全局警告框实现方法示例
2017/05/18 Javascript
浅谈jquery中ajax跨域提交的时候会有2次请求的问题
2017/11/10 jQuery
node.js中axios使用心得总结
2017/11/29 Javascript
10个在JavaScript开发中常遇到的BUG
2017/12/18 Javascript
node使用promise替代回调函数
2018/05/07 Javascript
layui 优化button按钮和弹出框的方法
2018/08/15 Javascript
Vue多组件仓库开发与发布详解
2019/02/28 Javascript
Vue开发之封装上传文件组件与用法示例
2019/04/25 Javascript
解决vue中使用less/sass及使用中遇到无效的问题
2020/10/24 Javascript
springboot+vue实现文件上传下载
2020/11/17 Vue.js
Python序列循环移位的3种方法推荐
2018/04/09 Python
python调用staf自动化框架的方法
2018/12/26 Python
python hbase读取数据发送kafka的方法
2018/12/27 Python
Python去除字符串前后空格的几种方法
2019/03/04 Python
Python使用正则表达式分割字符串的实现方法
2019/07/16 Python
Python API 操作Hadoop hdfs详解
2020/06/06 Python
CSS3实现的渐变幻灯片效果
2020/12/07 HTML / CSS
员工安全生产责任书
2014/07/22 职场文书
村安全生产责任书
2014/08/25 职场文书
2015年个人剖析材料范文
2014/12/29 职场文书
2015秋季小学开学寄语
2015/05/27 职场文书
Nginx配置80端口访问8080及项目名地址方法解析
2021/03/31 Servers
教你如何使用Python开发一个钉钉群应答机器人
2021/06/21 Python
浅谈Vue的computed计算属性
2022/03/21 Vue.js
Nginx如何获取自定义请求header头和URL参数详解
2022/07/23 Servers