用方法封装javascript的new操作符(一)
更新时间:2010年12月25日 23:01:33 作者:
虽然js是基于对象的,但在很多时候会使用到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<args.length;i++){
as.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;i<args.length;i++){
as.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<args.length;i++){
as.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;i<args.length;i++){
as.push('args['+i+']');
}
nobj = eval("new args[0]("+as.join(",")+");");
delete nobj.initialize;//删除实例化对象的方法
return nobj;
}
下一节开始丰富New方法。
相关文章
JavaScript正则表达式小结(test|match|search|replace|split|exec)
这篇文章主要介绍了JavaScript正则表达式小结(test|match|search|replace|split|exec)的相关资料,非常不错,具有参考借鉴价值,需要的朋友参考下吧2016-12-12JavaScript实现图片本地预览功能【不用上传至服务器】
这篇文章主要介绍了JavaScript实现图片本地预览功能,针对非IE浏览器的HTML5滤镜功能及IE浏览器的相关组件功能实现不上传至服务器预览本地图片的效果,需要的朋友可以参考下2017-09-09基于Bootstrap实现的下拉菜单手机端不能选择菜单项的原因附解决办法
小编使用bootstrap做的下拉菜单在电脑浏览器中可以正常使用,在手机浏览器中能弹出下拉列表却不能选择列表中的菜单项,怎么回事,如何解决呢?下面小编给大家分享下具体原因及解决办法,一起看下吧2016-07-07jquery操作下拉列表、文本框、复选框、单选框集合(收藏)
jquery操作拉列表、文本框、复选框、单选框集合。各种对下拉列表、文本框、复选框、单选框的jquery的相关操作。做为记录和收藏的最好方法2014-01-01javascript中$(function() {});写与不写有哪些区别
javascript中$(function() {....}) 是jQuery中的经典用法,等同于 $(document).ready(function() {....}) javascript中$(function() {});写与不写有哪些区别,需要的朋友可以参考下2015-08-08
最新评论