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