2015-02-10 33 views

回答

4

符號的優點是它們是唯一的,不能與另一個實例衝突(假設你沒有使用全局符號註冊表)。這對庫對象的模塊化,對象代理和向前兼容擴展很重要。

請考慮以下情形:您爲瀏覽器編碼。您修改原型,讓我們說HTMLElement,爲您的庫添加一個新的屬性。 現在whatwg/w3c出現併爲標準添加一個同名的屬性。突然你的圖書館與網絡標準衝突。

類似的事情發生在你繼承庫方法時。導入庫的新版本,它突然可能會有新的方法與您的相沖突。

這不會發生在符號中,因爲您首先實例化一個新的,自定義的本地符號,它不會與其他符號發生衝突。那麼你可以使用它作爲不會與任何第三方代碼相沖突的密鑰。

使用模塊,您可以簡單地將模塊的符號導出爲常量,使其可以被其他模塊訪問,但只能通過適當的基於模塊的命名空間來再次避免衝突。

類也可以使用它們表示符合某些接口(因爲JavaScript沒有多重繼承或接口),如Symbol.iterator不會冒名稱衝突或不得不妥協在其自己的方法名稱。

此外,它們也可以用作函數參數來避免魔術字符串常量,當它們與相同參數中的常規字符串處理混合時,這些常量可能會特別危險。更不用說,一個未聲明的符號(通常作爲一個常量導入)可能會導致比未知字符串傳入更多可預測的錯誤,並且簡單地通過方法中的特殊框架。

它們也可能提供性能優勢,因爲與符號比較基本上是O(1)指針比較而不是字符串比較。至少在編譯器無法推斷字符串常量相同的情況下。

+1

它最初也應該提供私有方法,但實際實現並不那麼私密。我個人更喜歡[WeakMaps](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/WeakMap)。 – 2015-02-10 16:25:04

相關問題