手写系列 - new运算符

94 阅读1分钟

先来看看 new 的定义

new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。

语法

new constructor[([arguments])]

constructor 一个指定对象实例的类型的类或函数。

arguments 一个用于被 constructor 调用的参数列表。

new 运算符的工作流程:

  1. 创建一个空对象 {}
  2. 将创建对象的 __proto__ 指向构造函数的 prototype
  3. 改变 this 的指向,将新创建的对象作为 this 的上下文,执行构造函数
  4. 返回新对象。如果该函数没有返回对象,则返回 this
function _new() {
  const obj = {};
  const [constructor, ...args] = [...arguments];
  obj.__proto__ = constructor.prototype;
  const result = constructor.apply(obj, args);
  return typeof result === "object" ? result : obj;
}

简单测试一下:

function Person(name, age) {
  this.name = name;
  this.age = age;
}
Person.prototype.run = function () {
  console.log("--fn start--");
};
let p1 = _new(Person, "xiaoming", 20);
p1.run();
console.log(p1);
let p2 = new Person("xiaoming", 20);
p2.run();
console.log(p2);