在JavaScript中,每个函数的原型对象都有一个constructor指向该函数的不可枚举的属性(EcmaScript§13.2)。它未在任何本机功能中使用(例如,instanceof仅检查原型链),但是我们建议在覆盖prototype用于继承的功能的属性时对其进行调整:
constructor
instanceof
prototype
SubClass.prototype = Object.create(SuperClass.prototype, { constructor: {value:SubClass, writable:true, configurable:true} });
但是,我们(包括我在内)是否只是为了清楚和整洁?是否存在依赖于该constructor属性的实际用例?
我真的看不到为什么该constructor属性就是JS中的属性。我偶尔会发现自己使用它来获取IE <9中对象的原型(例如Event对象)。但是,我确实认为它可以允许某些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,构造函数属性的 “优点” 是: