ES6 Class中實現私有屬性的幾種方法

原文:GitHubjavascript

私有屬性

私有屬性是面向對象編程(OOP)中很是常見的一個特性,通常知足如下的特色:java

  • 能被class內部的不一樣方法訪問,但不能在類外部被訪問;
  • 子類不能繼承父類的私有屬性。

備胎Class

時間回到四年前,2015年6月,ES6發佈成爲標準,爲了記念這個歷史性時刻,這個標準又被稱爲ES2015,至此,JavaScript中的class從備胎中轉正。在這以前,class一直做爲JS的關鍵字,雪藏不見天日。 class被認爲是JS的一種語法糖,它爲JavaScript帶來了用面向對象的思想描述一個實體的能力。但彷佛還遠遠不夠,class的能力遠沒知足JS開發者們的期待。因而,TC39的大佬們也努力地去作到更好,並推出了一項新的提案:git

class Foo {
  #a;  // 私有屬性
  constructor(a, b) {
    this.#a = a;
    this.b = b
  }
}
複製代碼

上面私有屬性的聲明,須要先通過Babel等編譯器編譯後才能正常使用。github

提案已經到Stage 3了,將來可期!面試

但是,一衆JSer們已經等不及了......編程

JSer的掙扎

經過對數據的必定封裝,JS開發者們走上了曲線實現「私有屬性」之路。閉包

1. 約定俗成ecmascript

JS界以一種不成文的規定,在變量前加上下劃線"_"前綴,約定這是一個私有屬性;但實際上,它仍然是一個穿上皇帝新衣般的公共屬性。 post

2. 閉包this

constructor做用域內定義局部變量,內部載經過閉包的方式對外暴露該變量。

這種方式,雖然實現了私有屬性外部不可訪問,但在類內部,該屬性一樣無法在不一樣的方法內共享,仍然不是嚴格意義上的「私有屬性」。

3. Symbols & Getters

利用Symbol變量能夠做爲對象key的特色,咱們能夠模擬實現更真實的私有屬性。

但是,也不是毫無破綻:
藉助 getOwnPropertySymbols方法能夠取出對象的 Symbol鍵值。

4. WeakMap & Getters

WeakMap的實現與Symbol一模一樣。

巨人的肩膀

以上,是目前階段JS實現屬性私有比較可行的方案,可能實際中不多應用,但若是你在面試中遇到這個問題,或許這些方案能夠參考下。

而後,全部這些方案裏面,建議選TypeScriptprivate

最後,關於JS中實現私有屬性,歡迎讀者們評論交流你的見解~


參照

相關文章
相關標籤/搜索