【问题标题】:Why is this property defined on the prototype--not on the constructor?为什么这个属性是在原型上定义的——而不是在构造函数上?
【发布时间】:2014-10-28 16:42:04
【问题描述】:

Bugs and Error Handling in Eloquent Javascript的章节中,我找到了以下代码。我想知道为什么作者在原型上设置 name 属性——而不是在构造函数中。

function InputError(message) {
  this.message = message;
  this.stack = (new Error()).stack;
}
InputError.prototype = Object.create(Error.prototype);
InputError.prototype.name = "InputError";

在整本书中,他一直在定义构造函数中的属性和原型上的方法。 Nicholas Zakas 建议在 Professional Javascript for Web Developers 的第 6 章中这样做,因为,他说,如果您在构造函数中定义方法,那么对构造函数的每次调用都会创建该方法的一个新实例。这当然是相反的情况——在原型上定义了一个属性。

重申一下:我想知道的是,为什么作者会在原型上定义 'name' 属性

到目前为止,我已经阅读了这两个 SO 帖子,两个都无济于事。

What is the difference between assigning a function directly to a constructor versus to it's prototype, and why?

-这告诉我我已经在上面提到的书中读到了什么。

Why defining properties in the prototype is considered an antipattern

-我并没有真正理解这篇文章,但我认为它无关紧要,因为它在谈论其他语言的模式。我关心javascript。

【问题讨论】:

    标签: javascript constructor prototype


    【解决方案1】:

    为什么作者可能在原型上定义了'name'属性?

    因为InputError 的每个实例共享相同的name。 “方法”只是具有作为值 (*) 的函数的属性的通俗术语。 通常这些方法应该在实例之间共享,但在某些情况下(比如这个)也可能是数据。


    *:意思是,属性方法没有区别。

    【讨论】:

      【解决方案2】:

      每个InputError 共享相同的名称。每个新实例中唯一真正需要更改的是message 参数。在这种情况下,这并不重要。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-14
        • 1970-01-01
        • 1970-01-01
        • 2016-06-12
        • 2021-11-06
        • 1970-01-01
        • 2017-11-10
        • 1970-01-01
        相关资源
        最近更新 更多