讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 建議19:不要使用類型構造器 >

建議19:不要使用類型構造器

在默認狀態下,JavaScript預定義了很多構造函數,如Function、Array、Date、string等,如果去掉小括號,它們就是JavaScript內置對象。在JavaScript中,構造函數實際上就是類的一種抽像結構。

利用new運算符調用構造函數,可以快速生成很多實例對象。例如:


var f=new Function(p1,p2,...,pn,body);


其中構造函數Function的參數類型都是字符串,p1~pn表示所創建函數的參數名稱列表,body表示所創建函數的函數結構體語句,在body語句之間通過分號進行分隔。可以完全省略所有參數,僅為構造函數傳遞一個字符串,用來表示函數的具體結構。f就是所創建函數的名稱。例如:


var f=new Function("a","b","return a+b");


使用new Function的形式來創建一個函數不是很常見,因為一個函數體通常會包括多條語句,如果將這些語句以一個字符串的形式作為參數來傳遞,代碼的可讀性會很差。類似的用法還有:


new Boolean(false)


new運算符調用函數會返回一個對象,該對像有一個valueof方法,同時返回被包裝的函數,其實這是完全沒有必要的,並且有時還令人困惑。不要使用new Boolean、new Number或new String。此外,應該避免使用new Object和new Array,可以使用{}和來代替。

在其他語言中,構造函數一般沒有返回值,它只是初始化由this關鍵字所指代的對象,並且什麼都不返回。但是,JavaScript構造函數可以返回一個對象,返回的對象將成為new運算符的運算值,此時this所引用的對象就會被覆蓋。


function F{

this.x=1;

return{y:2};

}

var f=new F;

f.y;//2


上面示例演示了如何使用返回的對象覆蓋構造函數的實例對象,但是,如果返回值是原始值時,就不會覆蓋實例化對象,此時按著普通函數的方式調用構造函數就可以得到返回值。例如:


function F{

this.x=1;

return true;

}

var f=new F;

f.x;//1

F;//true


因此,如果構造函數的返回值為對象,可以直接調用構造函數來引用該返回值對象,而不需要使用new運算符來運算。