原文: JavaScript, We Hardly new Ya --Douglas Crockford。
http://yuiblog.com/blog/2006/11/13/javascript-we-hardly-new-ya/引用JavaScript是一門基於原型的語言,但它卻擁有一個 new 操作符使得其看起來象一門經典的面對對象語言。那樣也迷惑了程式員們,導致一些有問題的編程模式。
其實你永遠不需要在JavaScript使用 new Object()。用字面量的形式{}去取代吧。
同理,不要使用 new Array() ,而代之以字面量[]。JavaScript中的數組並不象Java中的數組那樣工作的,使用類似Java的文法只會讓你糊塗。
同理不用使用 new Number, new String, 或者 new Boolean。這些的用法只會產生無用的類型封裝對象。就直接使用簡單的字面量吧。
不要使用 new Function 去建立函數對象。用函數運算式更好。比如:
frames[0].onfocus = new Function(”document.bgColor='antiquewhite'”)
更好的寫法是:
frames[0].onfocus = function () {document.bgColor = ‘antiquewhite';};
第二種形式讓指令碼編譯器更快的看到函數主體,於是其中的語法錯誤也會更快被檢測出來。有時候程式員使用 new Function 是因為他們沒有理解內建函式是如何工作的。
selObj.onchange = new Function(”dynamicOptionListObjects[”+
dol.index+”].change(this)”);
如果我們讓用字串做函數體,編譯器不能看到它們。如果我們用字串運算式做函數體,我們同樣也看不到它們。更好的方式就是不要盲目編程。通過製造一個傳回值為函數的函數調用,我們可以明確的按值傳遞我們想要綁定的值。這允許我們在迴圈中初始化一系列 selObj 對象。
selObj.onchange = function (i) {
return function () {
dynamicOptionListObjects[i].change(this);
};
}(dol.index);
直接對一個函數使用new永遠不是一個好主意。比如, new function 對構造新對象沒有提供什麼優勢。
myObj = new function () {
this.type = ‘core';
};
更好的方式是使用對象字面量,它更輕巧,更快捷。
myObj = {
type: ‘core'
};
假如我們需要建立的對象包含的方法需要訪問私人變數或者函數,更好的方式仍然是避免使用new.
var foo = new function() {
function processMessages(message) {
alert(”Message: ” + message.content);
}
this.init = function() {
subscribe(”/mytopic”, this, processMessages);
}
}
通過使用 new 去調用函數,對象會持有一個無意義的原型對象。這隻會浪費記憶體而不會帶來任何好處。如果我們不使用new,我們就不用在對象鏈維護一個無用的prototype對象。所以我們可以用()來正確的調用工廠函數。
var foo = function () {
function processMessages(message) {
alert(”Message: ” + message.content);
}
return {
init: function () {
subscribe(”/mytopic”, this, processMessages);
}
};
}();
所以原則很簡單: 唯一應該要用到new操作符的地方就是調用一個古老的構造器函數的時候。當調用一個構造器函數的時候,是強制要求使用new的。有時候可以來new一下, 有的時候還是不要了吧。引用注 原文:http://www.uiplanet.com/taobao/2007/05/15/%e4%bd%a0%e7%9c%9f%e7%9a%84%e4%bc%9a%e5%86%99javascript%e5%90%97%ef%bc%9f/
可以參考以下文章,英文的:http://msdn.microsoft.com/msdnmag/issues/07/05/JavaScript/default.aspx?loc=en#S6