原文:GitHubjavascript
私有屬性是面向對象編程(OOP
)中很是常見的一個特性,通常知足如下的特色:java
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們已經等不及了......編程
經過對數據的必定封裝,JS開發者們走上了曲線實現「私有屬性」之路。閉包
1. 約定俗成ecmascript
JS界以一種不成文的規定,在變量前加上下劃線"_
"前綴,約定這是一個私有屬性;但實際上,它仍然是一個穿上皇帝新衣般的公共屬性。 post
2. 閉包this
在constructor
做用域內定義局部變量,內部載經過閉包的方式對外暴露該變量。
3. Symbols & Getters
利用Symbol
變量能夠做爲對象key
的特色,咱們能夠模擬實現更真實的私有屬性。
getOwnPropertySymbols
方法能夠取出對象的
Symbol
鍵值。
4. WeakMap & Getters
WeakMap
的實現與Symbol
一模一樣。
以上,是目前階段JS實現屬性私有比較可行的方案,可能實際中不多應用,但若是你在面試中遇到這個問題,或許這些方案能夠參考下。
而後,全部這些方案裏面,建議選TypeScript
的private
。
最後,關於JS中實現私有屬性,歡迎讀者們評論交流你的見解~
參照: