在Bugs and Error Handling in Eloquent Javascript的章节中,我找到了以下代码。我想知道为什么writer在原型上设置name属性 - 而不是在构造函数中。
function InputError(message) {
this.message = message;
this.stack = (new Error()).stack;
}
InputError.prototype = Object.create(Error.prototype);
InputError.prototype.name = "InputError";
在整本书中,他一直在原型的构造函数和方法中定义属性。 Nicholas Zakas建议在专业Javascript for Web Developers 的Ch6中做同样的事情,因为,他说,如果你在构造函数中定义方法,那么每次调用构造函数都会创建一个新的方法实例。这当然是相反的情况 - 在原型上定义了一个属性。
重申:我想知道的是,为什么作者可能在原型上定义了'name'属性?
到目前为止,我已经阅读了这两篇SO帖子两篇无济于事。
- 这告诉我在上面提到的书中已经读过的内容。
Why defining properties in the prototype is considered an antipattern
- 我真的不明白这篇文章,但我认为这是无关紧要的,因为它正在谈论其他语言的模式。我关心javascript。
答案 0 :(得分:2)
为什么作者可能定义了' name'原型上的财产?
因为InputError
的每个实例共享相同的name
。 "方法"对于具有值(*)函数的属性来说,它只是一个口语术语。 通常是那些应该在实例之间共享的方法,但在某些情况下(比如这个)它也可能是数据。
*:意思是,属性和方法之间没有区别。
答案 1 :(得分:0)
每个InputError
共享相同的名称。在每个新实例中唯一真正需要更改的是message
参数。在这种情况下,它并不重要。