构造函数可以返回哪些值以避免返回此值?

Tho*_*ing 87 javascript constructor new-operator

除了this使用new关键字调用构造函数之外,Javascript中的return语句可以返回一个值的具体情况是什么?

例:

function Foo () {
  return something;
}

var foo = new Foo ();
Run Code Online (Sandbox Code Playgroud)

如果我没有弄错,if something是非函数原语,this将被返回.否则something返回.它是否正确?

IOW,可以something采取什么样的价值观(new Foo () instanceof Foo) === false

CMS*_*CMS 157

[[Construct]]内部属性描述了确切的条件,new运算符使用该属性:

来自ECMA-262 3rd.版本规格:

13.2.2 [[Construct]]

调用对象的[[Construct]]属性时,将执行以下步骤:FunctionF

  1. 创建一个新的本机ECMAScript对象.
  2. 设置[[Class]]属性Result(1)"Object".
  3. 获取原型属性的值F.
  4. 如果Result(3)是对象,请将[[Prototype]]属性设置Result(1)Result(3).
  5. 如果Result(3)不是对象,请按照15.2.3.1中的描述将[[Prototype]]属性设置Result(1)为原始Object原型对象.
  6. 调用[[Call]]属性F,提供Result(1)作为this值并提供[[Construct]]作为参数值传入的参数列表.
  7. 如果Type(Result(6))是, Object那么返回Result(6).
  8. 返回Result(1).

查看步骤7和8,仅当Result(6)(F构造函数返回的值)的类型不是 Object 时才返回新对象.

  • 附加说明:typeof(null)是"object",但是返回null会***触发第7步发生 (13认同)
  • @BT:在我的node.js安装上测试,看起来像上面引用的规范中的"Type(x)`是`Object`"意味着"`x instanceof Object`是'true`",*not*"` typeof(x)==='object'`是'true`".例如,`null instanceof Object`求值为false(实际上你不能从构造函数返回'null`),`new String("asdf")instanceof Object`求值为true(实际上你可以返回一个字符串)来自构造函数...) (5认同)
  • @JoSo:不.这意味着`x`不是原始值,而是一个对象(包括数组,函数等).它确实与`typeof`或`instanceof`无关. (3认同)
  • @Martian2049,因为 `null` 值的内部类型是 [Null Type](https://www.ecma-international.org/ecma-262/6.0/#sec-ecmascript-language-types-null-type ),在内部,您可能会认为这是“object”,因为`typeof null == 'object'`,但这不是内部 Type 操作检测到的。它将返回步骤 1 中创建的对象,因为在内部,“null”值_内部类型_是 Null,而不是 Object。 (2认同)