在JavaScript中,每个函数的原型对象都有一个不可枚举的属性constructor
,它指向函数(EcmaScript §13.2)。它不用于任何本机功能(例如instanceof
仅检查原型链),但是当覆盖函数的prototype
属性以进行继承时我们are encouraged to adjust it:
SubClass.prototype = Object.create(SuperClass.prototype, {
constructor: {value:SubClass, writable:true, configurable:true}
});
但是,我们(包括我)是否只是为了清晰和整洁而这样做?是否存在依赖于constructor
property的真实用例?
答案 0 :(得分:2)
我真的不明白为什么constructor
属性就是它在JS中的含义。我偶尔会发现自己使用它来获取IE中的对象原型(如Event对象)< 9.但是我确实认为允许一些ppl模仿经典的OO编程结构:
function Foo()
{
this.name = 'Foo';
}
function Bar()
{
this.name = 'Bar';
}
function Foobar(){};
Foo.prototype = new Foobar;
Foo.prototype.constructor = Foo;
Bar.prototype = new Foobar;
Bar.prototype.constructor = Bar;
var foo = new Foo();
var bar = new Bar();
//so far the set-up
function pseudoOverload(obj)
{
if (!(obj instanceof Foobar))
{
throw new Error 'I only take subclasses of Foobar';
}
if (obj.constructor.name === 'Foo')
{
return new obj.constructor;//reference to constructor is quite handy
}
//do stuff with Bar instance
}
所以AFAIK,构造函数属性的“优点”是:
答案 1 :(得分:0)
我的理解构造函数属性是用于查看特定对象是由哪个函数构造函数创建或构造的。
这是一个很好的例子: http://www.klauskomenda.com/code/javascript-inheritance-by-example/