函数的prototype
属性的constructor
属性意味着指向该函数,以便您可以询问对象是什么构造它的。它是作为创建功能对象的一部分自动设置的(请参阅规范的Section 13.2)。正如你所看到的,如果你愿意,你可以覆盖Foo.prototype
上的constructor
属性来改变它,但默认情况下就是这样。
有一个很好的理由可以覆盖它,这与继承有关。假设您想要创建一个创建基础对象的构造函数Base
,以及创建具有Base
的功能以及Derived
的添加/修改的派生对象的构造函数。你看,有(无辅助脚本)通常(但在我看来并不理想)的方法是:
function Base() {
}
Base.prototype.foo = function() {
console.log("I'm Base#foo");
};
function Derived() {
}
Derived.prototype = new Base(); // So we get all the `Base` stuff
Derived.prototype.bar = function() {
console.log("I'm Derived#bar");
};
var d = new Derived();
d.foo(); // "I'm Base#foo"
d.bar(); // "I'm Derived#bar"
的问题是,现在,d.constructor === Base
而非Derived
。因此,能够解决这个问题是很重要的:
...
Derived.prototype = new Base(); // So we get all the `Base` stuff
Derived.prototype.constructor = Derived; // Fix up
...
(边注:所有这些管道的 —和复杂围绕supercalls —的是,为什么这么多的人已经创造了这个辅助脚本,包括(咳嗽)mine)
注意上面并不意味着是建立继承层次的理想方式。这是你通常看到的,但正如我上面所说的,并不理想。只是为了完整性,这是更好的:
function Base() {
}
Base.prototype.foo = function() {
console.log("I'm Base#foo");
};
function Derived() {
Base.call(this); // So Base sets up its stuff
}
Derived.prototype = Object.create(Base.prototype); // So we get all the `Base` stuff
Derived.prototype.bar = function() {
console.log("I'm Derived#bar");
};
var d = new Derived();
d.foo(); // "I'm Base#foo"
d.bar(); // "I'm Derived#bar"
...其中预ES5环境中,您使用的垫片/填充工具为Object.create
。但是,我不直接这样做(并且不推荐它),我使用助手脚本,因此它是声明性的和可重复的。
我不熟悉的说着什么=新功能(){this.x = “Z”} ...是实际有效的语法? – kinakuta
不..这是一个错误。我会解决它。 – AlexMA
有很多相关的问题你可能想要阅读:http://stackoverflow.com/search?q=javascript+constructor+property – 2012-05-31 15:05:36