作家
登录

给Function做的OOP扩展

作者: 来源:www.28hudong.com 2013-03-30 02:37:25 阅读 我要评论

复制代码 代码如下:// 下面是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自己参阅月影的书

  推荐阅读

  日期 时间js控件

复制代码 代码如下:<script language="JavaScript"> /**//** *本日历选择控件由tiannet根据前人经验完善而得。大部分代码来自meizz的日历控件。 *tiannet添加了时间选择功能、select,object标签隐藏功能,还有其它>>>详细阅读


本文标题:给Function做的OOP扩展

地址:http://www.17bianji.com/kaifa2/JS/28737.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)