手写new运算符

new 实现了哪些功能

  • 新生成了一个对象
  • 链接到原型
  • 绑定 this
  • 返回新对象

代码

function create() {
    // 创建一个空的对象
    let obj = new Object()
    // 获得构造函数
    // 因为 arguments 类数组,所以我们可以用数组的 shift 来实现 arguments 的 ‘push’ 和 ‘pop’
    // 将 arguments 进数组,并将第一个元素移除并赋值给 Con (Constructor).
    let Con = [].shift.call(arguments)
    // 链接到原型
    obj.__proto__ = Con.prototype
    // 绑定this,并执行构造函数,就相当于 obj .constructor(arguments)
    let result = Con.apply(obj, arguments)
    // 确保 new 出来的是个对象
    return typeof result === 'object' ? result : obj
}

测试

function Dog(name,age){
  this.name = name
  this.age = age
}
Dog.prototype.wang = function(){
  console.log(`i am ${this.name},${this.age}`)
}

function create() {
    let obj = new Object()
    let Con = [].shift.call(arguments)
    obj.__proto__ = Con.prototype
    let result = Con.apply(obj, arguments)
    return typeof result === 'object' ? result : obj
}

let dog1 = new Dog('小黄',3)
let dog2 = create(Dog,'小黄',3)

dog1.wang()   // i am 小黄,3
dog2.wang()   // i am 小黄,3

原文链接:手写 new instanceof

你可能感兴趣的:(手写new运算符)