当前位置: 首页 > 图文教程 > 网络编程 > Javascript > 给Function做的OOP扩展

Javascript
JavaScript 语言精粹学习笔记
有关div页面拖动、缩放、关闭、遮罩效果代码
JQuery this 和 $(this) 的区别
JS 时间显示效果代码
jquery 表单进行客户端验证demo
JS 获取span标签中的值的代码 支持ie与firefox
JavaScript 获取用户客户端操作系统版本
可以读取EXCEL文件的js代码
JS去除字符串的空格增强版(可以去除中间的空格)
监控用户是否关闭浏览器的js代码
javascript 继承实现方法
JSON 入门指南 想了解json的朋友可以看下
javascript 函数调用规则
动态表格Table类的实现
JSON 客户端和服务器端的格式转换
jQuery ui1.7 dialog只能弹出一次问题
javascript 遍历验证所有文本框的值
关于IE、Firefox、Opera页面呈现异同 写脚本很痛苦
javascript 简练的几个函数
csdn 博客中实现运行代码功能实现

Javascript 中的 给Function做的OOP扩展


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-12   浏览: 296 ::
收藏到网摘: n/a

自编框架Megami的一部分……现在发现自己实在太宅了…… 文件中出现的名字请对号入座……
复制代码 代码如下:

// 下面是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自己参阅月影的书