1. 程式人生 > 其它 >js中new 做了哪些事情?

js中new 做了哪些事情?

我們在初始化一個建構函式例項時,需要用 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 為我們做了以下事情:

  1. 建立一個新的物件;
  2. 將新物件的proto 指向建構函式的 prototype;
  3. 用指定的引數通過 call/apply 呼叫建構函式,改變建構函式的 this 指向新建立的物件;
  4. 返回新建立的物件;

知道 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 結果完全一樣!