javascript - `constructor` 属性的真正用途是什么?

标签 javascript constructor prototype

在 JavaScript 中,每个函数的原型(prototype)对象都有一个不可枚举的属性 constructor它指向函数( EcmaScript §13.2 )。它不用于任何 native 功能(例如 instanceof 仅检查原型(prototype)链),但是我们 are encouraged to adjust it当覆盖prototype时继承函数的属性:

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

但是,我们(包括我)这样做只是为了清晰和整洁吗?是否有任何依赖 constructor property 的实际用例?

最佳答案

我真的不明白为什么 constructor 属性是 JS 中的属性。我偶尔发现自己使用它来获取 IE < 9 中对象的原型(prototype)(例如 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
}

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

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

关于javascript - `constructor` 属性的真正用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13543720/

相关文章:

javascript - 询问来自 servlet 的不同响应并使用 AJAX 和 JSP

javascript - audioParam.exponentialRampToValueAtTime 是如何工作的?

javascript - 如何从字符串开头以外的位置找到 Javascript 字符串中子字符串的索引?

javascript - Nodejs 为什么用原型(prototype)静态初始化数组?

function - Rust 中的函数原型(prototype)是什么?

javascript - 使用 CSS 类,但无法找到它的定义位置

java - JAX-WS(TomEE) Web 服务构造函数仅运行一次

c# - 语言资源文件的构造函数在 WPF 中生成为内部构造函数而不是公共(public)构造函数

c# - 字符串构造器

javascript - 有没有办法从方法中获取此/上下文?