Javascript 新运算符*总是* 覆盖返回值?

npi*_*piv 2 javascript

基于MDN 上关于新操作符如何工作的这些规范:

构造函数返回的对象成为整个 new 表达式的结果。如果构造函数没有明确返回对象,则使用在步骤 1 中创建的对象。(通常构造函数不返回值,但如果他们想覆盖正常的对象创建过程,他们可以选择这样做。)

我相信 new 运算符只会在未提供返回值的情况下覆盖返回值。然而,它似乎总是如此,你永远无法覆盖它。

例如

function test() { return 1; }
new test() // returns {} and not 1
Run Code Online (Sandbox Code Playgroud)

有人可以举例说明情况并非如此,例如他们在文档中所指的吗?

Nin*_*olz 5

您只能使用非原始值覆盖结果。

与原始

function test() { this.bar = '42'; return 1; }
console.log(new test()) // {}
Run Code Online (Sandbox Code Playgroud)

有对象,无原语

function test() { this.bar = '42'; return { foo: 'bar' }; }
console.log(new test()) //  { foo: 'bar' }; 
Run Code Online (Sandbox Code Playgroud)

带数组,不带基元

function test() { this.bar = '42'; return [42]; }
console.log(new test()) // [42]; 
Run Code Online (Sandbox Code Playgroud)