詳解ES6實(shí)現(xiàn)類(lèi)的私有變量的幾種寫(xiě)法
閉包實(shí)現(xiàn)類(lèi)的私有變量方式
私有變量不共享
通過(guò) new 關(guān)鍵字 person 的構(gòu)造函數(shù)內(nèi)部的 this 將會(huì)指向 Tom,開(kāi)辟新空間,再次全部執(zhí)行一遍,
class Person{
constructor(name){
let _num = 100;
this.name = name;
this.getNum = function(){
return _num;
}
this.addNum = function(){
return ++_num
}
}
}
const tom = new Person('tom')
const jack = new Person('jack')
tom.addNum()
console.log(tom.getNum()) //101
console.log(jack.getNum()) //100
私有變量可共享
為避免每個(gè)實(shí)力都生成了一個(gè)新的私有變量,造成是有變量不可共享的問(wèn)題,我們可以將這個(gè)私有變量放在類(lèi)的構(gòu)造函數(shù)到外面,繼續(xù)通過(guò)閉包來(lái)返回這個(gè)變量。
const Person = (function () {
let _num = 100;
return class _Person {
constructor(name) {
this.name = name;
}
addNum() {
return ++_num
}
getNum() {
return _num
}
}
})()
const tom = new Person('tom')
const jack = new Person('jack')
tom.addNum()
console.log(tom.getNum()) //101
console.log(jack.getNum()) //101
那這樣的話,如果兩種方法混合使用,那就可以擁有可共享和不可共享的兩種私有變量。
缺點(diǎn):實(shí)例化時(shí)會(huì)增加很多副本,比較耗內(nèi)存。
Symbol實(shí)現(xiàn)類(lèi)的私有變量方式
symbol 簡(jiǎn)介:
創(chuàng)建一個(gè)獨(dú)一無(wú)二的值,所有 Symbol 兩兩都不相等,創(chuàng)建時(shí)可以為其添加描述Symble("desc"),目前對(duì)象的健也支持 Symbol 了。
const name = Symbol('名字')
const person = { // 類(lèi)名
[name]:'www',
say(){
console.log(`name is ${this[name]} `)
}
}
person.say()
console.log(name)
使用Symbol為對(duì)象創(chuàng)建的健無(wú)法迭代和Json序列化,所以其最主要的作用就是為對(duì)象添加一個(gè)獨(dú)一無(wú)二的值。
但可以使用getOwnProporitySymbols()獲取Symbol.
缺點(diǎn):新語(yǔ)法瀏覽器兼容不是很廣泛。
symbol 實(shí)現(xiàn)類(lèi)的私有變量
推薦使用閉包的方式創(chuàng)建 Symbol 的的引用,這樣就可以在類(lèi)的方法區(qū)獲得此引用,避免方法都寫(xiě)在構(gòu)造函數(shù),每次創(chuàng)建新實(shí)例都要重新開(kāi)辟空間賦值方法,造成內(nèi)存浪費(fèi)。
const Person = (function () {
let _num = Symbol('_num:私有變量');
return class _Person {
constructor(name) {
this.name = name;
this[_num] = 100
}
addNum() {
return ++this[_num]
}
getNum() {
return this[_num]
}
}
})()
const tom = new Person('tom')
const jack = new Person('jack')
console.log(tom.addNum()) //101
console.log(jack.getNum()) //100
通過(guò) weakmap 創(chuàng)建私有變量
MDN 簡(jiǎn)介

實(shí)現(xiàn):
const Parent = (function () {
const privates = new WeakMap();
return class Parent {
constructor() {
const me = {
data: "Private data goes here"
};
privates.set(this, me);
}
getP() {
const me = privates.get(this);
return me
}
}
})()
let p = new Parent()
console.log(p)
console.log(p.getP())
總結(jié)
綜上 weakmap 的方式來(lái)實(shí)現(xiàn)類(lèi)似私有變量省內(nèi)存,易回收,又能夠被更多的瀏覽器兼容,也是最推薦的實(shí)現(xiàn)方法。
到此這篇關(guān)于詳解ES6實(shí)現(xiàn)類(lèi)的私有變量的幾種寫(xiě)法的文章就介紹到這了,更多相關(guān)ES6 類(lèi)的私有變量?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
bootstrap3使用bootstrap datetimepicker日期插件
這篇文章主要為大家詳細(xì)介紹了bootstrap3中使用bootstrap datetimepicker日期插件的用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
javascript的replace方法結(jié)合正則使用實(shí)例總結(jié)
這篇文章主要介紹了javascript的replace方法結(jié)合正則使用技巧,實(shí)例總結(jié)了replace方法配合正則表達(dá)式進(jìn)行變量、分組、字符等替換技巧,需要的朋友可以參考下2016-06-06
JavaScript高階教程之“==”隱藏下的類(lèi)型轉(zhuǎn)換
這篇文章主要給大家介紹了關(guān)于JavaScript高階教程之“==”隱藏下類(lèi)型轉(zhuǎn)換的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用JavaScript具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
如何利用JavaScript編寫(xiě)一個(gè)格斗小游戲
這篇文章主要給大家介紹了關(guān)于如何利用JavaScript編寫(xiě)一個(gè)格斗小游戲,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
使用JS+XML(數(shù)據(jù)島)實(shí)現(xiàn)分頁(yè))
使用JS+XML(數(shù)據(jù)島)實(shí)現(xiàn)分頁(yè))...2007-01-01
JavaScript實(shí)現(xiàn)二叉樹(shù)定義、遍歷及查找的方法詳解
這篇文章主要介紹了JavaScript實(shí)現(xiàn)二叉樹(shù)定義、遍歷及查找的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了二叉樹(shù)的相關(guān)概念及javascript構(gòu)建二叉樹(shù)、遍歷、查找二叉樹(shù)的常用操作技巧,需要的朋友可以參考下2017-12-12
一些Javascript的IE和Firefox(火狐)兼容性的問(wèn)題總結(jié)及常用例子
下面是一些Javascript的IE和Firefox(火狐)兼容性的常用例子2009-05-05
原生js實(shí)現(xiàn)查詢(xún)天氣小應(yīng)用
這篇文章主要為大家詳細(xì)介紹了原生js實(shí)現(xiàn)查詢(xún)天氣的小應(yīng)用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12

