用方法封裝javascript的new操作符(一)_javascript技巧
來源:懂視網
責編:小采
時間:2020-11-27 20:56:31
用方法封裝javascript的new操作符(一)_javascript技巧
用方法封裝javascript的new操作符(一)_javascript技巧:先看個例子: 代碼如下: var Class = { create : function () { return function () { this.initialize.apply(this, arguments); } } } var A = Class.create(); A.prototype = { initialize:functi
導讀用方法封裝javascript的new操作符(一)_javascript技巧:先看個例子: 代碼如下: var Class = { create : function () { return function () { this.initialize.apply(this, arguments); } } } var A = Class.create(); A.prototype = { initialize:functi

先看個例子:
代碼如下:
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方法。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com
用方法封裝javascript的new操作符(一)_javascript技巧
用方法封裝javascript的new操作符(一)_javascript技巧:先看個例子: 代碼如下: var Class = { create : function () { return function () { this.initialize.apply(this, arguments); } } } var A = Class.create(); A.prototype = { initialize:functi