關於 new 運算符的原理: 1、紅寶書上解釋: (1)創建一個新對象 (2)將構造函數的作用域賦給新對象 (3)執行構造函數中的代碼 (4)返回新對象 2、MDN上的解釋: (1)一個繼承自 Foo.prototype 的新對象被創建 (2)使用指定的參數調用構造函數 Foo,並將 this 綁定 ...
關於 new 運算符的原理:
1、紅寶書上解釋:
(1)創建一個新對象
(2)將構造函數的作用域賦給新對象
(3)執行構造函數中的代碼
(4)返回新對象
2、MDN上的解釋:
(1)一個繼承自 Foo.prototype 的新對象被創建
(2)使用指定的參數調用構造函數 Foo,並將 this 綁定到新創建的對象。new Foo 等同於 new Foo(),也就是沒有指定參數時,Foo 不帶任何參數調用的情況
(3)如果構造函數返回了一個“對象”,那麼這個對象會取代整個 new 出來的結果。如果構造函數沒有返回對象,那麼 new 出來的結果為步驟(1)創建的對象
3、總結:
使用 new 運算符時,其實就做了這三件事:
// 創建了一個空對象 obj,並將這個空對象的__proto__成員指向 Foo 函數對象 prototype 成員對象 var obj = {}; obj.__proto__ = Foo.prototype; // 將 Foo 函數對象的 this 指針替換成 obj,然後再調用Foo函數 Foo.call(obj);
// 判斷實例類型是否為對象,是則返回實例,否則返回構造函數 if (typeof obj === 'object') { return obj; } else { return Foo; }
也就是說,函數內部發生了以下變化:
(1)創建一個新對象,並繼承構造函數 Foo 的原型對象 Foo.prototype
(2)構造函數 Foo 被執行,執行時傳入相應的參數,並將 this 指定為新的實例
(3)判斷實例是否為對象,是則返回實例,否則返回構造函數