我想了解JavaScript的(或至少是V8的)有关构造函数的行为。为什么构造函数返回对象,但不是JavaScript中的基元?
我知道,JavaScript构造函数不应该返回任何东西(如:undefined
)。
但考虑这个JavaScript:
function Thing() {
return '';
}
var t = new Thing();
console.log(t, typeof t); // => Thing {} "object"
现在,如果你这样做:
function Thing() {
return { hi: '' };
}
var t = new Thing();
console.log(t, typeof t); // => Object {hi: ""} "object"
甚至:
function Thing() {
this.a = 'a';
return { hi: '' };
}
var t = new Thing();
console.log(t, typeof t); // => Object {hi: ""} "object"
那么,为什么在JavaScript中返回一个构造函数一个对象,但不是一个原始的,如果你写这种类型的代码?
此行为在this SO answer中也有提及,但未说明。我也浏览了ECMAScript规范的The new Operator部分,并对其Construct进行了缩减,但这并不具有启发性。
任何提示或知识(请用简单的英语)?
对于其中一个,它不是“错误和丑陋”,因为它没有按照你的想法去做。当它不是一个原始对象时为什么会返回一个基元? –
简而言之:如果从构造函数返回一个基元,它将被忽略。如果您返回一个对象,则将其用作结果对象。这是否回答了这个问题?或者你在寻找这种行为的基本原理吗? – deceze
它的行为方式是“因为规格说明是这样”。然而,我认为你所寻找的“为什么”的解释可能真的是基于意见的 - 你需要得到一个显示语言设计团队推理的答案,其他的只是某人的意见 - 例如,这里是我的:你已经调用'new',所以你期待一个对象,也许语言设计团队认为你应该总是得到一个对象,即使该函数返回一个原语,但我没有什么可靠的支持该推理。 –