用方法封裝javascript的new操作符(一)

來源:互聯網
上載者:User

先看個例子: 複製代碼 代碼如下: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方法。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.