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自己参阅月影的书
给Function做的OOP扩展
声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
Reply on: @reply_date@
@reply_contents@