一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務(wù)器之家 - 編程語言 - JavaScript - js教程 - 詳解ES6實(shí)現(xiàn)類的私有變量的幾種寫法

詳解ES6實(shí)現(xiàn)類的私有變量的幾種寫法

2022-01-20 16:46Do_Better js教程

這篇文章主要介紹了詳解ES6實(shí)現(xiàn)類的私有變量的幾種寫法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

閉包實(shí)現(xiàn)類的私有變量方式

私有變量不共享

通過 new 關(guān)鍵字 person 的構(gòu)造函數(shù)內(nèi)部的 this 將會指向 Tom,開辟新空間,再次全部執(zhí)行一遍,

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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

私有變量可共享

為避免每個實(shí)力都生成了一個新的私有變量,造成是有變量不可共享的問題,我們可以將這個私有變量放在類的構(gòu)造函數(shù)到外面,繼續(xù)通過閉包來返回這個變量。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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í)例化時會增加很多副本,比較耗內(nèi)存。

Symbol實(shí)現(xiàn)類的私有變量方式

symbol 簡介:

創(chuàng)建一個獨(dú)一無二的值,所有 Symbol 兩兩都不相等,創(chuàng)建時可以為其添加描述Symble("desc"),目前對象的健也支持 Symbol 了。

?
1
2
3
4
5
6
7
8
9
const name = Symbol('名字')
const person = { // 類名
  [name]:'www',
  say(){
    console.log(`name is ${this[name]} `)
  }
}
person.say()
console.log(name)

使用Symbol為對象創(chuàng)建的健無法迭代和Json序列化,所以其最主要的作用就是為對象添加一個獨(dú)一無二的值。
但可以使用getOwnProporitySymbols()獲取Symbol.
缺點(diǎn):新語法瀏覽器兼容不是很廣泛。

symbol 實(shí)現(xiàn)類的私有變量

推薦使用閉包的方式創(chuàng)建 Symbol 的的引用,這樣就可以在類的方法區(qū)獲得此引用,避免方法都寫在構(gòu)造函數(shù),每次創(chuàng)建新實(shí)例都要重新開辟空間賦值方法,造成內(nèi)存浪費(fèi)。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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

通過 weakmap 創(chuàng)建私有變量

MDN 簡介

詳解ES6實(shí)現(xiàn)類的私有變量的幾種寫法

實(shí)現(xiàn):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 的方式來實(shí)現(xiàn)類似私有變量省內(nèi)存,易回收,又能夠被更多的瀏覽器兼容,也是最推薦的實(shí)現(xiàn)方法。

到此這篇關(guān)于詳解ES6實(shí)現(xiàn)類的私有變量的幾種寫法的文章就介紹到這了,更多相關(guān)ES6 類的私有變量內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://juejin.cn/post/6926866949162926094

延伸 · 閱讀

精彩推薦
  • js教程javascript實(shí)現(xiàn)下拉菜單效果

    javascript實(shí)現(xiàn)下拉菜單效果

    這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)下拉菜單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下...

    愛前端的茂茂7212022-01-20
  • js教程原生js實(shí)現(xiàn)滑塊區(qū)間組件

    原生js實(shí)現(xiàn)滑塊區(qū)間組件

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)滑塊區(qū)間組件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下...

    蒲公英芽11902022-01-05
  • js教程詳解 TypeScript 函數(shù)聲明和重載

    詳解 TypeScript 函數(shù)聲明和重載

    在 JavaScript 中,函數(shù)是構(gòu)建應(yīng)用的一塊基石,我們可以使用函數(shù)抽離可復(fù)用的邏輯、抽象模型、封裝過程。在TypeScript中,函數(shù)仍然是最基本、最重要的概念...

    前端充電寶7112022-01-05
  • js教程微信小程序自定義modal彈窗組件的方法詳解

    微信小程序自定義modal彈窗組件的方法詳解

    這篇文章主要給大家介紹了關(guān)于微信小程序自定義modal彈窗組件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)...

    遇見小美好12212021-12-15
  • js教程JS removeAttribute()方法實(shí)現(xiàn)刪除元素的某個屬性

    JS removeAttribute()方法實(shí)現(xiàn)刪除元素的某個屬性

    這篇文章主要介紹了JS removeAttribute()方法實(shí)現(xiàn)刪除元素的某個屬性,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,...

    C語言中文網(wǎng)7762021-12-30
  • js教程原生JavaScript實(shí)現(xiàn)購物車

    原生JavaScript實(shí)現(xiàn)購物車

    這篇文章主要為大家詳細(xì)介紹了原生JavaScript實(shí)現(xiàn)購物車,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下...

    棟棟很優(yōu)秀啊4312021-12-29
  • js教程Javascript的15種數(shù)組去重方法,總有一種適合你

    Javascript的15種數(shù)組去重方法,總有一種適合你

    數(shù)組去重,一般都是在面試的時候才會碰到,一般是要求手寫數(shù)組去重方法的代碼。如果是被提問到,數(shù)組去重的方法有哪些?你能答出其中的10種,面試...

    前端微視界9012021-12-31
  • js教程微信小程序 接入騰訊地圖的兩種寫法

    微信小程序 接入騰訊地圖的兩種寫法

    這篇文章主要介紹了微信小程序 接入騰訊地圖的兩種寫法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參...

    木早長泉8812021-12-30
主站蜘蛛池模板: 思思99热久久精品在2019线 | 荡女淫春2古装 | 日韩欧美精品 | 亚洲欧美另类综合 | 国亚洲欧美日韩精品 | 国产成年人网站 | 深夜福利影院在线观看 | 亚洲国产美女精品久久 | 欧美色精品天天在线观看视频 | 亚洲AV综合99一二三四区 | 日本道高清| 忘忧草在线社区WWW日本-韩国 | 三上悠亚国产精品一区 | 欧美一级视频在线高清观看 | sss亚洲国产欧美一区二区 | 非洲一级毛片又粗又长aaaa | 高h细节肉爽文办公室 | 日韩欧美成末人一区二区三区 | 果冻传媒天美传媒乌鸦传媒 | 成人激情 | 成人国产第一区在线观看 | 粗又长好猛好爽视频 | 亚洲AV蜜桃永久无码精品无码网 | 久久综合中文字幕佐佐木希 | 国产免费看视频 | 国内精品视频九九九九 | 98在线视频噜噜噜国产 | 国产成年人在线观看 | tk白嫩玉足脚心vk | aaaa大片 | 跪在老师脚下吃丝袜脚 | 香蕉久久网 | 久久精品人人做人人爽97 | 黄 色 成 年人在线 幻女free性俄罗斯第一次摘花 | 微拍秒拍99福利精品小视频 | 国产综合亚洲专区在线 | 免费日本在线视频 | 女张腿男人桶羞羞漫画 | 青青热久免费精品视频精品 | 久久99亚洲热最新地址获取 | 欧美成人乱弄视频 |