说结果(1)

function Foo() {
  this.a = 1;
  return {
    a: 100
  };
}
Foo.prototype.a = 20;
Foo.prototype.b = 21;

console.log(new Foo().a);
console.log(new Foo().b);

输出?

将 return 删掉之后输出?

解答

补充:构造函数 return 一个对象时,new 表达式的结果就是这个对象;返回非对象(原始值)则被忽略,依旧返回新创建的实例。

  • 当前代码:
    • new Foo().a → 100(构造函数返回了 {a: 100},替换了默认实例);
    • new Foo().b → undefined(返回的对象上没有 b,原型链上的 b 也不可见)。
  • 删掉 return 后:
    • new Foo().a → 1(实例自身的 a);
    • new Foo().b → 21(原型上的 b)。