Skip to content

Latest commit

 

History

History
30 lines (28 loc) · 1.03 KB

0328.md

File metadata and controls

30 lines (28 loc) · 1.03 KB

实现一个new操作符

我们首先知道new做了什么:

  • 创建一个空的简单JavaScript对象(即{});
  • 链接该对象(即设置该对象的构造函数)到另一个对象 ;
  • 将步骤(1)新创建的对象作为this的上下文 ;
  • 如果该函数没有返回对象,则返回this。
  • 知道new做了什么,接下来我们就来实现它
function create(Con, ...args){
  // 创建一个空的对象
  this.obj = {};
  // 将空对象指向构造函数的原型链
  Object.setPrototypeOf(this.obj, Con.prototype);
  // obj绑定到构造函数上,便可以访问构造函数中的属性,即this.obj.Con(args)
  let result = Con.apply(this.obj, args);
  // 如果返回的result是一个对象则返回
  // new方法失效,否则返回obj
  return result instanceof Object ? result : this.obj;
}

function news(fn, ...args) {
    let instance = Object.create(fn.prototype)
    let res = fn.apply(instance, args)
    return typeof res === 'object' ? res : instance
}