为什么对象和数组构造函数不需要以new为前缀来构造对象?
考虑以下片段:-
function Custom(){}
// prints {}
console.log(Object());
// prints []
console.log(Array());
// prints undefined
console.log(Custom())
// prints {}
console.log(new Custom());
回答
该数组构造说:
当作为函数而不是构造函数调用时,还会创建和初始化一个新的 Array 对象。因此,函数调用 Array(…) 等效于具有相同参数的对象创建表达式 new Array(…)。
该对象的构造说:
- 如果 NewTarget 既不是 undefined 也不是活动函数,则 a. 返回 ?OrdinaryCreateFromConstructor(NewTarget, "%Object.prototype%")。
- 如果值未定义或为空,则返回!普通对象创建(%Object.prototype%)。
- 返回 !对象(值)。
因此,明确指出这new两者都不需要。
(不过,您可能永远不应该使用任何一个Object或Array作为构造函数,无论是否有new- 最好使用对象和数组文字)
如果需要,自己在 Custom 中实现此类事情将是微不足道的 - 检查该函数是否被调用new,如果不是,则显式返回某些内容:
function Custom(){
if (!new.target) {
return new Custom();
}
}
console.log(Custom())
console.log(new Custom());