JavaScript:new 一個函數和直接調用函數的區別分析

來源:互聯網
上載者:User

複製代碼 代碼如下:
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。
  通過上面兩段代碼,我們可以得出一個猜測,如果函數傳回值為常規意義上的實值型別(Number、String、Boolean)時,new 函數將會返回一個該函數的執行個體對象,而如果函數返回一個參考型別(Object、Array、Function),則 new 函數與直接調用函數產生的結果等同。通過在 Test 函數中返回不同類型的值進行測試,可以證實這一點。  
  分清這一點,其實還是蠻重要的,至少在看一些物件導向的架構類庫代碼時,會少一些疑惑。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.