一尘不染

真正使用的“ constructor”属性是什么?[重复]

javascript

在JavaScript中,每个函数的原型对象都有一个constructor指向该函数的不可枚举的属性(EcmaScript§13.2)。它未在任何本机功能中使用(例如,instanceof仅检查原型链),但是我们建议在覆盖prototype用于继承的功能的属性时对其进行调整:

SubClass.prototype = Object.create(SuperClass.prototype, {
    constructor: {value:SubClass, writable:true, configurable:true}
});

但是,我们(包括我在内)是否只是为了清楚和整洁?是否存在依赖于该constructor属性的实际用例?


阅读 292

收藏
2020-05-01

共1个答案

一尘不染

我真的看不到为什么该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,构造函数属性的 “优点” 是:

  • 从实例轻松实例化新对象
  • 能够 你的对象为某一类的子类,但仍然能够检查哪些特定类型的子类,你处理的。
  • 如您所说:保持整洁。
2020-05-01