new 关键字实现过程

44 阅读1分钟

new 关键字会进行如下的操作:

  1. 创建一个空对象
  2. 将空对象的原型,指向构造函数的原型
  3. 将空对象作为构造函数的上下文【改变this指向】
  4. 对构造函数有返回值处理判断
function creat(fn, ...args) {
  //1.创建一个空的简单JavaScript对象(即{})
  let obj = {};
  //2.为步骤1新创建的对象添加属性__proto__,将该属性链接至构造函数的原型对象
  Object.setPrototypeOf(obj, fn.prototype); //fn.prototype === obj.__proto__
  //obj.__proto__ = fn.prototype

  //3.将步骤1新创建的对象作为this的上下文
  let result = fn.apply(obj, args); //fn构造函数里面的this指向obj
  //4.如果该函数没有返回对象,则返回this。
  return result instanceof Object ? result : obj;
}

function Fn(name, age) {
  this.name = name;
  this.age = age;
  // return {} //{}
  // return 111 // { name: 'fux', age: 22 }
  // return null// { name: 'fux', age: 22 }
}