在 JavaScript 里,new
是个用于创建对象实例的关键字,当使用 new
调用构造函数时,会依次执行以下操作:
1. 创建新对象
new
操作符会先在内存中创建一个全新的空对象。这个新对象会继承自构造函数的原型,也就是说它会拥有构造函数原型上的属性和方法。
2. 绑定 this
把新创建的对象绑定到构造函数内部的 this
上。这样一来,在构造函数内部对 this
进行属性和方法的赋值操作,实际上都是在给新创建的对象添加属性和方法。
3. 执行构造函数
开始执行构造函数里的代码。在这个过程中,可能会对新对象进行属性的初始化,或者为其添加一些方法。
4. 返回对象
如果构造函数显式地返回了一个对象,那么 new
表达式的结果就是这个返回的对象;要是构造函数没有显式返回对象(返回 undefined
或者根本没有返回语句),则 new
操作符会返回之前创建的新对象。
展示代码
function myNew(constructor, ...args) {
// 确保传入的 constructor 是一个函数
if (typeof constructor !== 'function') {
throw new TypeError('Constructor must be a function');
}
// 创建一个新对象,修改原型链, 将新对象的__proto__ 指向目标对象的prototype
const newObj = Object.create(constructor.prototype);
// 使用 apply 调用构造函数,修改this指向,将参数传递给它
const result = constructor.apply(newObj, args);
// 如果构造函数返回的是对象或函数,则返回该对象或函数,否则返回新创建的对象
return result && (typeof result === 'object' || typeof result === 'function')
? result
: newObj;
}