首頁  >  文章  >  web前端  >  JavaScript:new 一個函數和直接呼叫函數的異同

JavaScript:new 一個函數和直接呼叫函數的異同

高洛峰
高洛峰原創
2016-11-25 14:29:35993瀏覽

或許許多人對此不以為然,在函數前面加上 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 的比較是基於引用的。

  為了更清楚的分辨在上述情況下兩者間的區別,請繼續看以下代碼:

function Test() { 

  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 函數中傳回不同類型的值進行測試,可以證實這一點。  

  分清這一點,其實還蠻重要的,至少在看一些物件導向的框架類別函式庫程式碼時,會少一些疑惑。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:HTML5時鐘下一篇:HTML5時鐘