在默認狀態下,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運算符來運算。