ES6 Class中實現(xiàn)私有屬性的一些方法總結(jié)
私有屬性
私有屬性是面向?qū)ο缶幊蹋∣OP)中非常常見的一個特性,一般滿足以下的特點:
- 能被class內(nèi)部的不同方法訪問,但不能在類外部被訪問;
- 子類不能繼承父類的私有屬性。
備胎Class
時間回到四年前,2015年6月,ES6發(fā)布成為標準,為了紀念這個歷史性時刻,這個標準又被稱為ES2015,至此,JavaScript中的class從備胎中轉(zhuǎn)正。在這之前,class一直作為JS的關(guān)鍵字,雪藏不見天日。
class被認為是JS的一種語法糖,它為JavaScript帶來了用面向?qū)ο蟮乃枷朊枋鲆粋€實體的能力。但似乎還遠遠不夠,class的能力遠沒滿足JS開發(fā)者們的期待。于是,TC39的大佬們也努力地去做到更好,并推出了一項新的提案:
class Foo { #a; // 私有屬性 constructor(a, b) { this.#a = a; this.b = b } }
上面私有屬性的聲明,需要先經(jīng)過Babel等編譯器編譯后才能正常使用。
提案已經(jīng)到Stage 3了,未來可期!
可是,一眾JSer們已經(jīng)等不及了......
JSer的掙扎
通過對數(shù)據(jù)的一定封裝,JS開發(fā)者們走上了曲線實現(xiàn)“私有屬性”之路。
1. 約定俗成
JS界以一種不成文的規(guī)定,在變量前加上下劃線"_"前綴,約定這是一個私有屬性;但實際上,它仍然是一個穿上皇帝新衣般的公共屬性。
2. 閉包
在constructor作用域內(nèi)定義局部變量,內(nèi)部載通過閉包的方式對外暴露該變量。
這種方式,雖然實現(xiàn)了私有屬性外部不可訪問,但在類內(nèi)部,該屬性同樣沒法在不同的方法內(nèi)共享,仍然不是嚴格意義上的“私有屬性”。
3. Symbols & Getters
利用Symbol變量可以作為對象key的特點,我們可以模擬實現(xiàn)更真實的私有屬性。
可是,也不是毫無破綻:
借助getOwnPropertySymbols方法可以取出對象的Symbol鍵值。
4. WeakMap & Getters
WeakMap的實現(xiàn)與Symbol如出一轍。
巨人的肩膀
以上,是目前階段JS實現(xiàn)屬性私有比較可行的方案,可能實際中很少應用,但如果你在面試中遇到這個問題,或許這些方案可以參考下。
然后,所有這些方案里面,建議選TypeScript的private。
最后,關(guān)于JS中實現(xiàn)私有屬性,歡迎讀者們評論交流你的看法~
參照:
ECMAScript Classes - Keeping Things Private
原文:Github
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。
相關(guān)文章
js小數(shù)運算出現(xiàn)多位小數(shù)如何解決
關(guān)于JavaScript小數(shù)進行加、減、乘、除出現(xiàn)多位小數(shù)問題,自己研究了一下,而且作了相關(guān)的測試,收獲不少知識點,需要的朋友可以參考下2015-10-10關(guān)于JavaScript中name的意義沖突示例介紹
這篇文章主要介紹了關(guān)于JavaScript中name的意義沖突,需要的朋友可以參考下2014-05-05JS+CSS制作DIV層可(最小化/拖拽/排序)功能實現(xiàn)代碼
DIV層最小化和隨意拖拽排序,很多的愛好者都想實現(xiàn)這個功能,小編整理搜集了一下,希望本文的知識點可以幫助到你2013-02-02