学习记录——实现new运算符

134 阅读1分钟

使用new调用函数会执行以下操作

  1. 创建一个全新的对象
  2. 这个新对象会被执行[[Prototype]]连接
  3. 这个新对象会绑定到函数调用的this
  4. 如果函数没有返回其他对象,那么表达式中的函数调用会自动返回这个新对象为

实现代码

/**
 * 实现 new 运算符
 */
function myNew (func) {
  // 创建一个全新的对象,执行原型连接
  var o = Object.create(func.prototype)
  // 这个新对象会绑定到函数调用的this
  var k = func.call(o)
  // 如果函数没有返回其他对象,那么表达式中的函数调用会自动返回这个新对象为
  if (typeof k === 'object') {
    return k
  } else {
    return o
  }
}

Object.create 创建一个新的对象 文档

Object.create是创建对象的一种方式,Object.create会创建一个新对象,并把新对象的原型指向第一个参数,所以用Object.create创建的对象满足new操作符的前两点操作。

绑定调用函数的this到新对象去

使用Function.prototype.call()将传进来的函数的this指向新创建的对象,在函数对象调用call方法的同时,会将函数执行。用apply也是可以的。