手写实现new操作符,你真正理解它了吗?

5 min read

new操作符是JavaScript的一个运算符,用于实例化一个类并创建一个新的对象实例。它的作用就是根据给定的构造函数创建一个新的对象,同时将传入的参数传递给构造函数来赋初值。具体的执行过程如下:

  1. 创建一个新的对象
  2. 将构造函数的prototype属性赋值给新的对象的__proto__属性
  3. 将构造函数的this指向新的对象,并执行构造函数内部的代码
  4. 如果构造函数返回的是一个对象,则直接返回此对象。否则返回新创建的对象

手动实现一个new方法的代码如下:

function myNew(fn, ...args) {
  // 第一步,创建一个新的对象
  let obj = {};

  // 第二步,将新对象的原型指向构造函数的原型
  obj.__proto__ = fn.prototype;

  // 第三步,将构造函数内部的this指向新对象,并执行构造函数内部的代码
  let result = fn.apply(obj, args);

  // 第四步,如果构造函数返回的是对象,则返回该对象,否则返回新创建的对象
  return result instanceof Object ? result : obj;
}

调用方式和使用new操作符一样:

function Person(name, age) {
  this.name = name;
  this.age = age;
}

let p1 = myNew(Person, 'Tom', 18);
console.log(p1.name); // 'Tom'
console.log(p1.age); // '18'