js中new 做了哪些事情?
阿新 • • 發佈:2021-08-10
我們在初始化一個建構函式例項時,需要用 new 操作符去初始化例項,那麼我們在 new 一個建構函式的時候 new 到底為我們做了什麼呢?
function Person(name) { this.name = name; } Person.prototype.sayHi = function () { console.log(this.name); }; const jayken = new Person("Jayken"); // Person {name: "Jayken"} // name: "Jayken" // __proto__: // sayHi: ƒ () // constructor: ƒ Person(name) // __proto__: Object
從上面的例子可以看出 new 為我們做了以下事情:
- 建立一個新的物件;
- 將新物件的proto 指向建構函式的 prototype;
- 用指定的引數通過 call/apply 呼叫建構函式,改變建構函式的 this 指向新建立的物件;
- 返回新建立的物件;
知道 new 做了什麼後,我們來動手實現一個
/** * * @param Fn 傳入的建構函式 * @param args 需要傳給建構函式的引數 */ function creater(Fn, ...args) { // Object.create()方法建立一個新物件,使用現有的物件來提供新建立的物件的__proto__。 (MDN) const obj = Object.create(Fn.prototype); // 使用apply呼叫Fn建構函式,將Fn的this指向obj Fn.apply(obj, args); return obj; }
實現完成後我們用 Person 函式來驗證一下:
const jayken = creater(Person, "Jayken");
// Person {name: "Jayken"}
// name: "Jayken"
// __proto__:
// sayHi: ƒ ()
// constructor: ƒ Person(name)
// __proto__: Object
OK 結果完全一樣!