用方法封装javascript的new操作符(一)_javascript技巧
程序员文章站
2022-05-11 18:01:07
...
先看个例子:
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方法。
复制代码 代码如下:
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;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;i
}
nobj = eval("new args[0]("+as.join(",")+");");
delete nobj.initialize;//删除实例化对象的方法
return nobj;
}
下一节开始丰富New方法。
推荐阅读
-
JavaScript实现父子dom同时绑定两个点击事件,一个用捕获,一个用冒泡时执行顺序的方法
-
用js写了一个类似php的print_r输出换行功能_javascript技巧
-
一个js导致的jquery失效问题的解决方法_javascript技巧
-
js创建一个input数组并绑定click事件的方法_javascript技巧
-
Javascript 数组添加一个 indexOf 方法的实现代码_javascript技巧
-
javascript 处理HTML元素必须避免使用的一种方法_javascript技巧
-
用js实现计算代码行数的简单方法附代码_javascript技巧
-
用Javascript同时提交多个Web表单的方法_javascript技巧
-
JS实现点击按钮自动增加一个单元格的方法_javascript技巧
-
javascript的函数、创建对象、封装、属性和方法、继承_javascript技巧