为什么对象和数组构造函数不需要以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(…)。

该对象的构造说:

  1. 如果 NewTarget 既不是 undefined 也不是活动函数,则 a. 返回 ?OrdinaryCreateFromConstructor(NewTarget, "%Object.prototype%")。
  2. 如果值未定义或为空,则返回!普通对象创建(%Object.prototype%)。
  3. 返回 !对象(值)。

因此,明确指出这new两者都不需要。

(不过,您可能永远不应该使用任何一个ObjectArray作为构造函数,无论是否有new- 最好使用对象和数组文字)

如果需要,自己在 Custom 中实现此类事情将是微不足道的 - 检查该函数是否被调用new,如果不是,则显式返回某些内容:

function Custom(){
  if (!new.target) {
    return new Custom();
  }
}
console.log(Custom())
console.log(new Custom());


以上是为什么对象和数组构造函数不需要以new为前缀来构造对象?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>