什么是`constructor`属性真正用于什么?

Ber*_*rgi 5 javascript constructor prototype

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

SubClass.prototype = Object.create(SuperClass.prototype, {
    constructor: {value:SubClass, writable:true, configurable:true}
});
Run Code Online (Sandbox Code Playgroud)

但是,我们(包括我)是否只是为了清晰和整洁而这样做?是否存在依赖于该constructor属性的真实用例?

Eli*_*gem 2

我真的不明白为什么这个 constructor 属性是 JS 中的样子。我偶尔发现自己使用它来获取 IE < 9 中对象的原型(例如 Event 对象)。不过我确实认为它的存在是为了允许某些人模仿经典的 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
}
Run Code Online (Sandbox Code Playgroud)

所以据我所知,构造函数属性的“优点”是:

  • 轻松地从实例实例化新对象
  • 能够将您的对象分组为某个类的子类,但仍然能够检查您正在处理的子类的特定类型。
  • 正如你所说:保持整洁。


归档时间:

查看次数:

585 次

最近记录:

12 年,5 月 前