这个问题纯粹具有学术价值。
给定构造函数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()本身?
答案 0 :(得分:2)
构造函数只不过是一个简单的函数。任何函数都是构造函数。
真实和唯一的魔法在new operator:它是那个创建给定“类”的新实例的运算符。
引用MDN:
当执行代码new foo(...)时,会发生以下情况:
创建一个新对象,继承自foo.prototype。
在 使用指定的参数调用构造函数foo 这绑定到新创建的对象。 new foo相当于new foo(),即如果没有指定参数列表,则调用foo 参数。
构造函数返回的对象变为 全新表达的结果。如果构造函数 没有显式返回一个对象,在步骤1中创建的对象是 用来代替。 (通常构造函数不返回值,但它们 如果他们想要覆盖普通对象,可以选择这样做 创作过程。)
请注意订单:您不会将new
应用于Foo()
,而应用于Foo
。这就是你也可以写
var o = new Foo;