Home  >  Article  >  Web Front-end  >  用方法封装javascript的new操作符(一)_javascript技巧

用方法封装javascript的new操作符(一)_javascript技巧

WBOY
WBOYOriginal
2016-05-16 18:13:311008browse

先看个例子:

复制代码 代码如下:

var Class = {
create : function () {
return function () {
this.initialize.apply(this, arguments);
}
}
}
var A = Class.create();
A.prototype = {
initialize:function(){
//todo
}
test:"abc"
}
var a = new A();

这是很多jser构建类和实例化对象的过程, 细心的人会发现: 实例化的a会多一个initialize方法。initialize在实例化时做为代理在实例化后就没有存在的意义了,而且有时候会引起不必要的麻烦,比如 for…in 语句遍历a时,会把initialize这个方法遍历出来。
我首先想到的是用前面博文中写的Class.js来做,这样就非常干净。但是在Class.js中的继承机制有一些bug的,在不入侵(即:不修改原型、不生成额外属性)的条件下,要实现接口更是难上加难了。于是我就想到封装new操作符,这样做的好处就是 可先修改原型,在封装new的方法中,实现继承、接口,并去除额外属性。
我们首先给new操作符的简单的实现一下:
复制代码 代码如下:

function New(){//new是关键字,所以要区别一下
var as = [],args = arguments;
for(var i=1;ias.push('args['+i+']');
}
nobj = eval("new args[0]("+as.join(",")+");");
return nobj;
}
接下来测试一下:
function A(n){ this.name = n;}
var a1 = new A('ts');
alert(a1.name);//ts
var a2 = New(A,'tangoboy');
alert(a2.name);//tangoboy
测试成功,现在New方法基本可以代替new操作符实例化对象了。
然后 解决文章开始的initialize问题就非常简单了:
function New(){
var as = [],args = arguments;
for(var i=1;ias.push('args['+i+']');
}
nobj = eval("new args[0]("+as.join(",")+");");
delete nobj.initialize;//删除实例化对象的方法
return nobj;
}

下一节开始丰富New方法。
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn