2014-10-28 84 views
0

在關於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建議在的Ch6中做同樣的事情,因爲他說,如果你在構造函數中定義了方法,那麼每次調用構造函數都會創建一個新的方法實例。這當然是相反的情況 - 在原型上定義一個屬性。

重申:我想知道的是,爲什麼作者可能在原型上定義了'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

-I並沒有真正理解這個職位,但我認爲這是無關緊要的,因爲它是在談論其他語言的模式。我關心的是JavaScript。

回答

2

爲什麼作者可能在原型上定義了'name'屬性?

因爲InputError的每個實例共享相同的name。 「方法」對於具有函數值(*)的屬性只是一個口語術語。 通常它是那些應該在實例之間共享的方法,但在某些情況下(比如這個)它可能也是數據。


*:意義,有財產方法之間沒有什麼區別。

0

每個InputError共用一個名稱。每個新實例中唯一需要更改的參數是message參數。在這種情況下,這並不重要。

相關問題