或許許多人對此不以為然,在函數前面加上 new 關鍵字,不就是實例化一個物件嗎?但事情顯然沒那麼簡單:
function Test() {
this.name = 'Test';
return function() { return true; }
}
} test 是什麼?
是一個 Test 物件嗎?錯!這裡 test 是函數-Test 中傳回的 function() { return true; }。這時,new Test() 等效於Test(),注意,是等效於,不是等於,如果使用new Test() == Test() 判定兩者是否相等,則會回傳false,因為 Javascript 對於Object和Function 的比較是基於引用的。
this.name = 'Test';
〠〜 fnT = Test();
var newT = new Test();
顯然,fnT 是字串Test,那newT 呢?呵呵,是不是被第一個範例迷惑了?其實,此時 newT 是一個 Test 物件——有一個名為 name 的屬性,其值為字串 Test。
透過上面兩段程式碼,我們可以得出一個猜測,如果函數傳回值為常規意義上的值類型(Number、String、Boolean)時,new 函數將會傳回一個該函數的實例對象,而如果函數傳回一個參考類型(Object、Array、Function),則new 函數與直接呼叫函數產生的結果等同。透過在 Test 函數中傳回不同類型的值進行測試,可以證實這一點。
分清這一點,其實還蠻重要的,至少在看一些物件導向的框架類別函式庫程式碼時,會少一些疑惑。