JavaScript本是一種基于原形的(prototypal)語言,但它的“new”操作符看起來有點像經典語言。這迷惑了廣大程序員們,并導致了很多使用上的問題。
在JavaScript中,不要用到new Object()這種操作,該用{ }來代替。同理,也不要用new Array(),相應的,用[]來代替。JavaScript的Array絕不同于Java的Array,模仿Java的語法只會使人越來越糊涂。
也不要用new Number,new String,或是new Boolean。在JavaScript使用包裝對象完全沒有必要,只需使用普通的聲明就可以了。
不要用new Function來新建一個function,而應當用最普通的function表達式。例如:
frames[0].onfocus = new Function(”document.bgColor=’antiquewhite’”)
更好的寫法是:
frames[0].onfocus = function () {document.bgColor = ‘antiquewhite’;};
同樣定義一個事件,第二句不會立即檢測函數體,哪怕是函數體有錯,也不會立即報錯。只有不了解function內部機制的人才會用new Function這種聲明方式。
selObj.onchange = new Function(”dynamicOptionListObjects["
dol.index "].change(this)”);
如果我們直接寫出函數體,編譯器是無法看到其內部的(也就無法立即執行、無法立即引發錯誤)。但如果我們用表達式方式聲明函數(如上),看不到函數內部的則是我們。編程的話,還是盡量對一且都盡量清晰可見吧。以聲明函數的方式來返回一個函數,我們可以更加明確地傳值,如下代碼,它還可以設定一個初始值。
selObj.onchange = function (i) {
return function () {
dynamicOptionListObjects.change(this);
};
}(dol.index);
還有一個不好的習慣是將new放到function的前面,比如,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來執行此方法,這個對象會掛在一個沒有意義的prototype上,它只會浪費內存。如果我們不用new,就不會浪費prototype對象于prototype鏈,所以,更佳的方案是使用()。如下所示:
var foo = function () {
function processMessages(message) {
alert(”Message: ” message.content);
}
return {
init: function () {
subscribe(”/mytopic”, this, processMessages);
}
};
}();
譯后總結:由于以前對yui并不了解直接就用了ext,對js的不少地方也一知半解,直到看了這篇frank所給的文章才對new操作符略知一二。
給我的感覺就是:盡量不要顯示地用new操作符,因為new這個東西在編譯期就已經對對象進行初始化了,不用new的話運行期才進行初始化檢查。(實際上我的用詞不準確,在js中都是編譯期,或都是運行期)。這樣可以節省內存,且有利于調試,亦便于理解。
Ext的源碼中用到了很多上面所提及的寫法,如果以前不很明白,看完篇文章之后會有種豁然開朗的感覺。
對“prototype鏈”不太明白的可以參考這篇?http://www.javaeye.com/topic/53537