或許許多人對此不以為然
在函數前加 new 關鍵字
不就是實例化一個對象嗎?但事情顯然沒那麼簡單
復制代碼 代碼如下:
function Test() {
this
name =
Test
;
return function() { return true; }
}
var test = new Test(); // 這裡的 test 是什麼?
是一個 Test 對象嗎?錯!這裡 test 是一個函數——Test 中返回的 function() { return true; }這時new Test() 等效於 Test()注意是等效於不是等於如果使用new Test() == Test() 判定兩者是否相等則會返回 false因為 Javascript 對於 Object 和 Function 的比較是基於引用的
為了更清晰的分辨在上述情形下兩者間的區別請繼續看以下代碼
復制代碼 代碼如下:
function Test() {
this
name =
Test
;
return
Test
;
}
var fnT = Test();
var newT = new Test();
顯然fnT 是字符串 Test那 newT 呢?呵呵是不是被第一個樣例迷惑了?其實此時 newT 是一個 Test 對象——有一個名為 name 的屬性其值為字符串 Test
通過上面兩段代碼我們可以得出一個猜測如果函數返回值為常規意義上的值類型(NumberStringBoolean)時new 函數將會返回一個該函數的實例對象而如果函數返回一個引用類型(ObjectArrayFunction)則 new 函數與直接調用函數產生的結果等同通過在 Test 函數中返回不同類型的值進行測試可以證實這一點
分清這一點其實還是蠻重要的至少在看一些面向對象的框架類庫代碼時會少一些疑惑
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/20188.html