我引用最近Google JavaScript Style Guide:ES5 getter和setter方法是「潛在的令人驚訝和難以推理」
不要使用JavaScript getter and setter properties。它們可能令人驚訝並且難以推理,並且對編譯器的支持有限。改爲提供普通的方法。
例外:在使用數據綁定框架(如Angular和Polymer)時,可以謹慎使用getter和setter。但是請注意,編譯器支持是有限的。使用它們時,必須在類或對象字面量中使用
get foo()
和set foo(value)
來定義它們,否則必須使用Object.defineProperties
來定義它們。請勿使用Object.defineProperty
,這會干擾屬性重命名。吸氣者不得改變可觀察的狀態。非法:
class Foo { get next() { return this.nextId++; } }
這是谷歌的意見,但我想真正瞭解的原因。
首先,我認爲「編譯器」有一個有限的支持是Babel/Traceur/TypeScript?或者在某些ES5引擎中缺乏支持?
此外,我想了解什麼是「令人驚訝和困難」作者認爲的原因。我看到這些限制:
Object.assign()
不復制獲取者,但執行它們並複製值;- 使用
get name()
語法,無法將getter添加到現有對象。對於現有對象,必須使用Object.defineProperty
。 - 用lambda定義一個getter是不可能的,這個限制可能導致我們在某些情況下使用舊學校
let that = this
。
我不明白的語句:「Object.defineProperty
妨礙了物業更名」。 (什麼是「屬性重命名」?)
非常感謝,我現在明白了「物業更名」。關於「潛在的令人驚訝的事情」:我認爲這只是實現令人驚訝的時候?在你的例子中,二傳手應該拋出一個負數的例外,這個驚喜將會消失。我個人使用getters而不使用setter,以便懶惰地評估成員並使只讀(但是生活)屬性。不過,您的回答似乎是對Google推薦的一個很好的解釋。我等一會兒,然後我會驗證它。 – Paleo