跳到主要内容

new 时发生了什么?

  1. 创建一个新的对象 obj;
  2. 将这个空对象的proto成员指向了 Base 函数对象 prototype 成员对象
  3. Base 函数对象的 this 指针替换成 obj, 相当于执行了 Base.call(obj);
  4. 如果构造函数显示的返回一个对象,那么则这个实例为这个返回的对象。 否则返回这个新创建的对象

简单写法

var obj = {}
obj.__proto__ = Base.prototype
Base.call(obj)

满分写法

function myNew(target) {
let result = {}
let arg = Array.prototype.slice.call(arguments, 1)
// 将实例对象的 __proto__ 指向 target.prototype
Object.setPrototypeOf(result, target.prototype)
// this 指向实例对象
target.apply(result, arg)
return result
}

// 测试
function User(name, age) {
this.name = name
this.age = age
}

let user = myNew(User, 'Jason', 23)
console.log(user.__proto__ === User.prototype) // true