new操作符是JavaScript的一个运算符,用于实例化一个类并创建一个新的对象实例。它的作用就是根据给定的构造函数创建一个新的对象,同时将传入的参数传递给构造函数来赋初值。具体的执行过程如下:
- 创建一个新的对象
- 将构造函数的prototype属性赋值给新的对象的__proto__属性
- 将构造函数的this指向新的对象,并执行构造函数内部的代码
- 如果构造函数返回的是一个对象,则直接返回此对象。否则返回新创建的对象
手动实现一个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'