先来看看 new 的定义
new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。
语法
new constructor[([arguments])]
constructor
一个指定对象实例的类型的类或函数。
arguments
一个用于被 constructor 调用的参数列表。
new 运算符的工作流程:
- 创建一个空对象 {}
- 将创建对象的
__proto__指向构造函数的prototype - 改变 this 的指向,将新创建的对象作为 this 的上下文,执行构造函数
- 返回新对象。如果该函数没有返回对象,则返回 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);