手机
当前位置:查字典教程网 >编程开发 >Javascript教程 >给Function做的OOP扩展
给Function做的OOP扩展
摘要:复制代码代码如下://下面是OOP用的方法//这样很猥琐……因为JS并不是OOP语言……//但伟大的伍迷指引我们来这么干//Belldand...

复制代码 代码如下:

// 下面是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扩展】相关文章:

jQuery获取字符串中出现最多的数

浅谈JavaScript中的Math.atan()方法的使用

js-穷举法 (y0h)

JavaScipt中Function()函数的使用教程

js设置document.domain实现跨域的注意点分析

Javascript中setTimeOut和setInterval的定时器用法

JQuery中DOM实现事件移除的方法

一条一条新闻向上的滚动 不错

JS实现窗口加载时模拟鼠标移动的方法

解决未知尺寸的图片撑破页面的问题

精品推荐
分类导航