1. new 一个构造函数的过程:

【1】创建一个空对象

【2】空对象的 [[ prototype ]] 指向 构造函数的 prototype

【3】将 this 指向新对象

【4】执行构造函数内部代码,给新对象添加属性

【5】返回新对象

2. 手写 new:

function Dog(name) {
  this.name = name;
}

Dog.prototype.say = function () {
  console.log("Wang!")
};

function myNew(object, ...args) {
  // 创建一个新对象, 并将其[[prototype]]指向构造函数的原型对象
  let o = Object.create(object.prototype);
  // 改变this指向,给新对象添加属性
  let new_o = object.apply(o, args);
  return new_o instanceof Object ? new_o : o;
}

let newDog = myNew(Dog, 'Andy');
console.log(newDog.name); // Andy