为什么对象的构造函数返回Object()而不是其构造函数?

时间:2014-05-15 16:58:40

标签: javascript inheritance prototype

这个问题纯粹具有学术价值。

给定构造函数Foo()

function Foo(){
    this.x = 1;
}

和该类的实例:

var o = new Foo(); // Instance of Foo()

console.log(o.constructor); // => Foo(): The constructor of `o` is `Foo()` - this makes sense so far.

但是,如果我手动设置Foo()构造函数的原型属性...

Foo.prototype = { z: 3};

var o = new Foo(); // Instance of Foo()

o的构造函数变为Object(),因此不是Foo()

console.log(o.constructor); // => Object {}

我认为Foo()(o' s prototype属性)已更改,但Foo()实例的构造函数仍然不变Foo()?是不是更改了 Foo()的prototype属性,而不是Foo()本身?

1 个答案:

答案 0 :(得分:2)

构造函数只不过是一个简单的函数。任何函数都是构造函数。

真实和唯一的魔法在new operator:它是那个创建给定“类”的新实例的运算符。

引用MDN:

  

当执行代码new foo(...)时,会发生以下情况:

     
      
  • 创建一个新对象,继承自foo.prototype。

  •   
  • 在   使用指定的参数调用构造函数foo   这绑定到新创建的对象。 new foo相当于new   foo(),即如果没有指定参数列表,则调用foo   参数。

  •   
  • 构造函数返回的对象变为   全新表达的结果。如果构造函数   没有显式返回一个对象,在步骤1中创建的对象是   用来代替。 (通常构造函数不返回值,但它们   如果他们想要覆盖普通对象,可以选择这样做   创作过程。)

  •   

请注意订单:您不会将new应用于Foo(),而应用于Foo。这就是你也可以写

的原因
var o = new Foo;