5分钟搞定new

2019-10-12  本文已影响0人  percykuang

5分钟搞定new

new一个函数到底干了啥?

在JS中,当new一个函数后,JS编译器将会做以下四件事情

  1. 创建一个新的空对象

  2. 把这个空对象链接到这个函数(构造函数)的原型对象上

  3. 这个对象被绑定为this

  4. 如果这个函数不返回任何东西,或者返回的值是除对象外的其它基本类型,那么默认就会return this

  5. 如果这个函数返回的是一个对象,那么就会直接返回这个对象,而不会return this

自己写一个new

/**
 * myNew默认第一个参数是一个函数假设为fn,后续的参数作为fn的参数
 */
function myNew() {
  if (arguments.length === 0 || typeof arguments[0] !== 'function') {
    throw new Error('error: please check your params!!')
  }
  var _args = Array.from(arguments)
  var _constructor = _args.shift()
  var _this = Object.create(_constructor.prototype)
  var res = _constructor.apply(_this, _args)

  // 注意:对于new这个关键字来说,如果你默认在构造函数中不返回任何值,则它会帮你返回构造出的对象。
  // 如果你在构造函数中手动的写了返回值,也不是所有的返回值都是原封不动返回的。
  // 如果返回的是null、undefined等一些基本类型,则都会返回 new 出来的对象;
  // 如果返回的是object,才会把这个object当成返回值返回出去
  if (res instanceof Object) {
    return res
  }
  return _this
}
上一篇 下一篇

猜你喜欢

热点阅读