JS面试手写:实现一个简单的 new

68 阅读1分钟

new 的过程中发生了什么?

如果一个函数被使用new操作符调用了,那么它会执行如下操作:

  1. 在内存中创建一个新的对象(空对象);
  2. 这个对象内部的[[prototype]]属性会被赋值为该构造函数的prototype属性;
  3. 构造函数内部的this,会指向创建出来的新对象;
  4. 执行函数的内部代码(函数体代码);
  5. 如果构造函数没有返回非空对象,则返回创建出来的新对象;

实现一个简单的new

function _new(fn, ...arg) {
 // 1.创建一个新对象
 let o = new Object();

 // 2.把o的__proto__指向fn的prototype,实现继承
 o.__proto__ = fn.prototype;
 // 有的浏览器不兼容__proto__,这里可以使用Object.setPrototypeOf建立原型的连接
 // Object.setPrototypeOf(o, fn.prototype);

 // 3 - 4.改变this指向,并执行构造函数内部代码
 let resObj = fn.apply(o, arg);

 // 5.如果返回值是一个object类型,则返回这个结果,否则返回这个新创建的对象
 return typeof resObj === "object" ? resObj : o;
}