精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

私有屬性的六種實現方式,你用過幾種?

開發 前端
class 用于定義圍繞某個概念的一系列屬性和方法,這些屬性和方法有的是內部用的,有的是對外的。只有內部用的屬性、方法需要實現私有化。

class 是創建對象的模版,由一系列屬性和方法構成,用于表示對同一概念的數據和操作。

有的屬性和方法是對外的,但也有的是只想內部用的,也就是私有的,那怎么實現私有屬性和方法呢?

不知道大家會怎么實現,我梳理了下,我大概用過 6 種方式,我們分別來看一下:

_prop

區分私有和共有最簡單的方式就是加個下劃線 _,從命名上來區分。

比如:

class Dong {
constructor() {
this._name = 'dong';
this._age = 20;
this.friend = 'guang';
}
hello() {
return 'I\'m ' + this._name + ', ' + this._age + ' years old';
}
}
const dong = new Dong();

console.log(dong.hello());

這里的 Dong 就有私有屬性 _name、_age,共有屬性 friend。

但是這種方式只是一種命名規范,告訴開發者這個屬性、方法是私有的,不要調用,但終究不是強制的,如果別人要用也阻止不了。

不過這種方式用的還是挺多的,歷史比較悠久。

那怎么能基于這種規范實現真正的私有呢?這就要用到 Proxy 了:

Proxy

Proxy 可以定義目標對象的 get、set、Object.keys 的邏輯,可以在這一層做一下判斷,如果是下劃線 _ 開頭就不讓訪問,否則就可以訪問。

比如還是這個 class:

class Dong {
constructor() {
this._name = 'dong';
this._age = 20;
this.friend = 'guang';
}
hello() {
return 'I\'m ' + this._name + ', ' + this._age + ' years old';
}
}
const dong = new Dong();

我們不直接調用它的對象的屬性方法了,而是先用一層 Proxy 來約束下 get、set、getKeys 的行為:

const dong = new Dong();
const handler = {
get(target, prop) {
if (prop.startsWith('_')) {
return;
}
return target[prop];
},
set(target, prop, value) {
if (prop.startsWith('_')) {
return;
}
target[prop] = value;
},
ownKeys(target, prop) {
return Object.keys(target).filter(key => !key.startsWith('_'))
},
}
const proxy = new Proxy(dong, handler)

我們通過 new Proxy 來給 dong 定義了 get、set、ownKeys 的 handler:

  • get: 如果以下劃線 _ 開頭就返回空,否則返回目標對象的屬性值 target[prop]。
  • set: 如果以下劃線 _ 開頭就直接返回,否則設置目標對象的屬性值。
  • ownKeys: 訪問 keys 時,過濾掉目標對象中下劃線開頭的屬性再返回。

這樣就實現了下劃線開頭的屬性的私有化:

我們測試下:


const proxy = new Proxy(dong, handler)

for (const key of Object.keys(proxy)) {
console.log(key, proxy[key])
}

確實,這里只打印了共有屬性的方法,而下劃線開頭的那兩個屬性沒有打印。

我們基于 _prop 這種命名規范實現了真正的私有屬性!

再調用下方法試試:

咋是 undefined 了?

因為 proxy.hello 方法的 this 也是指向 proxy 的,也會受限制,所以要再做下處理:

如果用的是方法,那就給它綁定 this 為目標對象。

這樣 hello 方法就可以訪問到那些 _ 開頭的私有屬性了:

我們通過 Proxy 給下劃線的命名規范實現了真正的私有屬性,但是要定義一層 Proxy 比較麻煩,有沒有不定義 Prxoy 的方式呢?

確實有,比如 Symbol:

Symbol

Symbol 是 es2015 添加的一個 api,用于創建唯一的值。基于這個唯一的特性,我們就可以實現私有屬性。

比如這樣:

const nameSymbol = Symbol('name');
const ageSymbol = Symbol('age');
class Dong {
constructor() {
this[nameSymbol] = 'dong';
this[ageSymbol] = 20;
}
hello() {
return 'I\'m ' + this[nameSymbol] + ', ' + this[ageSymbol] + ' years old';
}
}
const dong = new Dong();

我們不再用 name 和 age 作為私有屬性名了,而是用 Symbol 生成唯一的值來作為名字。

這樣外面因為拿不到屬性名,就沒法取到對應的屬性值:

這種方式比 Proxy 的方式更簡單一些,也是用的很多的一種實現私有屬性的方式。

如果想暴露出去,可以定義個 get 方法:

但是這種私有屬性是真的沒法訪問么?

不是的,有一個 api 叫做 Object.getOwnPropertySymbols,可以取到對象的所有 Symbols 屬性,然后就可以拿到屬性值了:

所以說這種方式只是 Object.keys 取不到對應的屬性而已,不如 Proxy 那種方式完善。

那不用 Proxy 的方式,還比有沒有 Symbol 更完善的呢?

那可以試試這種:

WeakMap

外面可以訪問到屬性和方法是因為我們把它掛到了 this 上,那不掛到 this 上外面不就訪問不到了么?

比如用一個 Map 保存私有屬性:

const privateFields = new Map();
class Dong {
constructor() {
privateFields.set('name', 'dong');
privateFields.set('age', 20);
}
hello() {
return 'I\'m ' + privateFields.get('name') + ', ' + privateFields.get('name') + ' years old';
}
}

我們測試下:

這樣貌似可以,但不知道大家有沒有發現其中的問題:

  • 所有對象都用同一個 Map,之間相互影響。
  • 對象銷毀了這個 Map 依然存在。

怎么解決這個問題呢?

不知道大家用沒用過 WeakMap,它的特性是只能用對象作為 key,對象銷毀,這個鍵值對就銷毀。

完美解決了上面兩個問題:

  • 因為是用對象作為 key 的,那不同的對象是放在不同的鍵值對上的,相互沒影響。
  • 對象銷毀的時候,對應的鍵值對就銷毀,不需要手動管理。

貌似是很完美,我們實現下:

const dongName = new WeakMap();
const dongAge = new WeakMap();
const classPrivateFieldSet = function(receiver, state, value) {
state.set(receiver, value);
}
const classPrivateFieldGet = function(receiver, state) {
return state.get(receiver);
}
class Dong {
constructor() {
dongName.set(this, void 0);
dongAge.set(this, void 0);
classPrivateFieldSet(this, dongName, 'dong');
classPrivateFieldSet(this, dongAge, 20);
}
hello() {
return 'I\'m ' + classPrivateFieldGet(this, dongName) + ', ' + classPrivateFieldGet(this, dongAge) + ' years old';
}
}

每個屬性定義了一個 WeakMap 來維護,key 為當前對象,值為屬性值,get 和 set 使用 classPrivateFieldSet 和 classPrivateFieldGet 這兩個方法,最終是通過從 WeakMap 中存取的。

在構造器里初始化下當前對象對應的屬性值,也就是 dongName.set(this, void 0),這里的 void 0 的返回值是 undefined,一個意思。

測試下:

哇,通過 WeakMap 也能實現私有屬性!

不過這里的 classPrivateFieldGet 沒必要定義吧,直接 xxMap.get 不就行么?

確實,包一層的目的是為了可以加一些額外的邏輯,這里也可以直接從 weakMap 取。

但這樣寫起來也很麻煩呀,有沒有更簡單的方式呢?

能不能設計一種語法糖,它自動編譯成這種方式呢?

想的沒錯,確實有這種語法糖:

#prop

現在有一個私有屬性的 es 草案,可以通過 # 的方式來標識私有屬性和方法。

比如這樣:

class Dong {
constructor() {
this.#name = 'dong';
this.#age = 20;
this.friend = 'guang';
}
hello() {
return 'I\'m ' + this.#name + this.#age + 'years old';
}
}

這里的 name 和 age 都是私有的,而 friend 是共有的。

這種新語法 JS 引擎沒那么快支持,但是可以通過 babel 或者 ts 編譯器來編譯成低版本語法的方式來提前用。

比如 babel 有 @babel/proposal-private-property-in-object 的插件,它可以實現這種語法的編譯:

babel 就是把 #prop 編譯成上面那種 WeakMap 的方式來實現的。

這個插件在 @babel/preset-env 的預設里,會自動引入:

除了 babel,ts 里也可以直接用這種語法:

也是會編譯成 WeakMap 的方式來實現。

其實 ts 實現的新語法還是不少的,比如 ? 和 ?? 分別是可選鏈和默認值的語法,下面這兩種寫法等價:

const res = data?.name ?? 'dong';
const res2 = data && data.name || 'dong';

這種新語法都是直接可用的,babel 的話需要引入下 proposal 插件。

對了,我記得 ts 里 class 也是有 private 的修飾符的,那個不也是私有屬性么?

其實它是私有屬性但也不完全是,我們來看一下:

ts private

ts 可以通過 private 來修飾屬性、方法的可見性:

  • private 表示屬性私有,只有 class 內部可訪問。
  • protected 表示保護,只有 class 和子 class 可訪問。
  • public 表示共有,外部也可訪問。

類型檢查和提示的時候是有區別的,比如 private 屬性在 class 外部不可訪問:

而 class 內部是可以訪問的:

但是這種約束只是用于類型檢查的,只存在編譯期間,運行時并沒有這種約束。

我們可以看下編譯后的代碼:

可以看到沒有做任何處理。

而如果用 #prop 的方式,除了編譯時是 private 的,運行時也是:

所以,要實現真正的 private 的話,還是用 #prop 的方式,如果只是編譯時約束那聲明下 private 就行。

總結

class 用于定義圍繞某個概念的一系列屬性和方法,這些屬性和方法有的是內部用的,有的是對外的。只有內部用的屬性、方法需要實現私有化。

實現私有屬性方法,我樹立了 6 種方式:

  • 通過下劃線 _prop 從命名上區分。
  • 通過 Proxy 來定義 get、set、ownKeys 的邏輯。
  • 通過 Symbol 來定義唯一的屬性名,不能通過 keys 拿到。
  • 通過 WeakMap 來保存所有對象的私有屬性和方法。
  • 通過 #prop 的 es 新語法實現私有,babel 和 tsc 會把它們編譯成 WeakMap 的方式。
  • 通過 ts 的 private 在編譯時約束。

這六種方式,有三種只是偽私有,比如 _prop(依然可以訪問)、ts 的 private(運行時可訪問)、Symbol(可以通過 Object.getOwnSymbols 拿到 symbol 來訪問)。

另外三種是真正的私有,包括 Proxy、WeakMap、#prop(目前是編譯為 WeakMap 的方式)。

這 6 種實現私有屬性的方式,你用過幾種?

責任編輯:姜華 來源: 神光的編程秘籍
相關推薦

2021-12-15 23:10:34

JS Debugger 前端開發

2025-01-21 10:04:40

Java并發阻塞隊列

2023-10-30 11:53:37

繼承JS父類

2019-09-02 11:14:08

隔離虛擬機操作系統

2024-11-08 09:37:10

C#組件

2025-04-17 07:10:03

API架構項目

2017-06-26 10:35:58

前端JavaScript繼承方式

2018-08-03 16:40:06

前端前端框架微服務

2023-05-10 13:58:13

服務限流系統

2019-05-16 13:00:18

異步編程JavaScript回調函數

2025-02-27 00:00:30

SpringJava方式

2009-02-11 09:46:00

ASON網絡演進

2017-07-20 08:47:19

網頁加載時間移動開發IT

2020-07-31 11:12:39

安全威脅網絡攻擊網絡安全

2022-01-14 10:34:50

黑客隱藏蹤跡網絡安全

2020-04-27 09:00:00

雙因素認證身份認證生物識別

2022-03-23 12:55:50

農業物聯網

2024-11-20 15:24:49

2024-10-30 16:39:45

2024-01-22 08:53:00

策略任務RocketMQ
點贊
收藏

51CTO技術棧公眾號

欧美性受xxxxxx黑人xyx性爽| 日韩伦理一区二区三区av在线| 欧美人妻精品一区二区三区| 国产精品x8x8一区二区| 色av成人天堂桃色av| 国产免费xxx| 日本一区高清| 久久99国内精品| 一区久久精品| 亚洲国产精品悠悠久久琪琪| 久久午夜夜伦鲁鲁一区二区| а√资源新版在线天堂| xfplay精品久久| 成人免费福利视频| 久久99国产综合精品免费| 91亚洲一区| 精品一区二区亚洲| 肉色超薄丝袜脚交| 都市激情亚洲一区| 亚洲免费观看在线视频| 欧美一区三区二区在线观看| 性欧美一区二区三区| 奇米888四色在线精品| 欧美精品成人91久久久久久久| www色com| 亚洲成在人线免费观看| 日韩久久免费av| 成人日韩在线视频| 日韩精品影院| 欧美日韩国产丝袜另类| 成年人深夜视频| 调教视频免费在线观看| 久久人人超碰精品| 国产亚洲欧美一区二区| 国内精品国产成人国产三级| 秋霞电影一区二区| 国产成人精品一区二区在线 | 欧美激情一区在线观看| 激情视频一区二区| 欧美一区二不卡视频| 国产另类ts人妖一区二区| 国产精品视频精品| 波多野结衣在线电影| 亚洲欧美日韩国产| 国产69精品久久久久久| 国产午夜小视频| 欧美日韩精品一本二本三本| 久热精品视频在线| 视频国产一区二区| 午夜国产一区二区| 久久精品国产一区| 免费中文字幕在线| 欧美在线看片| 欧美另类极品videosbestfree| 女性裸体视频网站| 午夜激情久久| 九九九热精品免费视频观看网站| 亚洲国产精品免费在线观看| 亚洲午夜精品一区 二区 三区| y97精品国产97久久久久久| 国产又粗又猛又爽又黄的视频小说| 欧美色图一区| 最新亚洲国产精品| 男人操女人的视频网站| 好看的av在线不卡观看| 韩国一区二区电影| 毛片毛片女人毛片毛片| 老司机精品久久| 国产精品久久久久免费a∨| 亚洲中文字幕在线一区| 国产在线精品免费| 成人免费在线看片| 少妇高潮久久久| 99久久久精品免费观看国产蜜| 久久涩涩网站| yw在线观看| 亚洲欧美精品午睡沙发| 激情五月婷婷六月| 无码小电影在线观看网站免费| 色噜噜狠狠成人中文综合| 亚洲久久中文字幕| 天堂精品久久久久| 日韩av在线网| 91免费在线看片| 欧美 日韩 国产一区二区在线视频 | 国产精品国产三级国产专播精品人| 精品一区二三区| 狠狠色丁香婷婷综合| 国产精品一区二区三区精品 | 久久久91麻豆精品国产一区| 亚洲国产精品999| 欧美丰满美乳xxⅹ高潮www| 一区二区三区网站| 欧洲精品在线视频| 国产乱子伦精品无码码专区| 99亚偷拍自图区亚洲| 亚洲欧美久久234| 51精品视频| 欧美日韩成人一区| 少妇饥渴放荡91麻豆| 欧美aaaa视频| 97国产精品视频人人做人人爱| 黄色大全在线观看| 国产ts人妖一区二区| 日韩av图片| 黄色在线看片| 欧美日韩夫妻久久| 国产美女喷水视频| 欧美福利影院| 国产精品视频精品| 日韩av资源| 亚洲国产视频a| 亚洲综合激情视频| 亚洲理论电影| 久久久免费电影| 无码人妻丰满熟妇区五十路 | 日韩中文字幕有码| 影音先锋在线一区| 91精品久久香蕉国产线看观看| 黄色在线播放| 五月婷婷激情综合网| 99国产精品久久久久久| 国产成人3p视频免费观看| 韩国福利视频一区| www.com欧美| 国产精品久久久一区麻豆最新章节| 国产中文字幕免费观看| 99a精品视频在线观看| 久久久999国产精品| 午夜一级黄色片| 久久久不卡网国产精品一区| 久久国产精品视频在线观看| 亚洲成人影音| 欧美日韩爱爱视频| japanese国产| 亚洲精品第1页| 亚洲女人在线观看| 婷婷综合激情| 成人激情综合网| 男人的天堂在线视频免费观看 | 亚洲综合精品在线| 日本一区二区在线不卡| 国产三级日本三级在线播放| 久久99久久人婷婷精品综合 | 国产成年人免费视频| 国产激情精品久久久第一区二区| 精品91一区二区三区| 久久天堂影院| 久久精品国产精品| 99草在线视频| 亚洲一区二区av在线| 免费不卡的av| 国产亚洲毛片在线| 欧美国产一二三区| 日本.亚洲电影| 日韩在线精品视频| 国产一区二区在线播放视频| 免费**毛片在线| 一区二区三区国产精品| 亚洲精品久久一区二区三区777 | 欧美h版在线观看| 欧美激情2020午夜免费观看| 国产 欧美 自拍| 五月激情综合网| 中文字幕国产综合| 热久久免费视频| 亚洲一卡二卡区| 韩国三级成人在线| 欧美极品欧美精品欧美视频 | 97久久精品人人做人人爽50路| 国产特级黄色大片| 欧美综合久久| 波多野结衣精品久久| 欧美13videosex性极品| 夜夜嗨av色综合久久久综合网| 一二三四区在线| 一区二区三区国产豹纹内裤在线| 无遮挡aaaaa大片免费看| 日日噜噜夜夜狠狠视频欧美人| 在线观看精品视频| av不卡一区| 国产精品福利在线观看| 成a人片在线观看| 日韩福利视频在线观看| 中文字幕一区二区人妻痴汉电车| 亚洲精品成人天堂一二三| 国产激情视频网站| 精品中文字幕一区二区| 国产一区二区四区| 欧美呦呦网站| 韩国成人一区| 91精品亚洲一区在线观看| 国内成人精品一区| 91欧美在线视频| 精品福利一二区| 久久久久久av无码免费看大片| 亚洲精品第1页| 亚洲精品国产一区黑色丝袜| 国产另类ts人妖一区二区| 99久久久无码国产精品6| 97偷自拍亚洲综合二区| 久久福利电影| 精品一区二区三区中文字幕视频| 日韩免费观看视频| 欧美另类tv| 日日噜噜噜夜夜爽亚洲精品| 少妇高潮一区二区三区69| 欧美另类高清zo欧美| 啦啦啦免费高清视频在线观看| 亚洲男同1069视频| 天堂资源在线视频| 91丨国产丨九色丨pron| 波多野结衣中文字幕在线播放| 日本v片在线高清不卡在线观看| 男人的天堂狠狠干| 中文不卡在线| 一区二区免费电影| 国产精品片aa在线观看| 国产欧美综合精品一区二区| 精品中文在线| 国产在线视频2019最新视频| 亚洲精品国产嫩草在线观看| 98视频在线噜噜噜国产| 好看的中文字幕在线播放| 久久精品这里热有精品| 丁香婷婷在线观看| 亚洲人精选亚洲人成在线| 国产小视频免费观看| 91精品黄色片免费大全| 一级特黄aaa| 欧美色精品在线视频| 免费无码国产精品| 色综合久久中文综合久久牛| 国产精品乱子伦| 天涯成人国产亚洲精品一区av| 国产一级性生活| 亚洲一区二区三区在线播放| 欧美成人片在线观看| 亚洲欧美日韩国产中文在线| 黄色av片三级三级三级免费看| 国产亚洲欧美日韩日本| 国产伦精品一区二区三区四区免费 | 日本少妇激三级做爰在线| 日韩高清不卡一区二区| 国产xxxxx视频| 久久久久久久波多野高潮日日| 精品视频在线观看一区| 亚洲激情女人| 欧美变态另类刺激| 99精品国产99久久久久久福利| 日韩精品 欧美| 亚洲深爱激情| 国产偷人视频免费| 日韩在线观看一区二区| 亚洲 中文字幕 日韩 无码| 日韩va欧美va亚洲va久久| 91看片在线免费观看| 蜜臀av亚洲一区中文字幕| 亚洲综合av在线播放| 国产麻豆视频一区二区| 无码人妻一区二区三区一| 成人激情免费网站| 国产精品无码久久久久久| 国产午夜精品福利| 欧日韩不卡视频| 亚洲欧美激情在线| 久久综合激情网| 欧美视频在线视频| 亚洲 国产 日韩 欧美| 欧美日韩精品三区| www黄色在线观看| 亚洲激情在线观看视频免费| 你懂得网站在线| 中文字幕综合在线| 青青青国内视频在线观看软件| 午夜精品久久久99热福利| 日韩大尺度黄色| 91精品久久久久久久久久入口| 亚洲精品aⅴ| 免费久久99精品国产自| 欧美电影免费播放| 4444亚洲人成无码网在线观看| 性欧美精品高清| 国产福利精品一区二区三区| 成人一区二区三区视频| x88av在线| 亚洲无线码一区二区三区| 国产成人精品777777| 91精品婷婷国产综合久久性色| 日本波多野结衣在线| 尤物99国产成人精品视频| 国产在线观看91| 青青久久aⅴ北条麻妃| av在线成人| 欧美极品色图| 欧美激情1区| www.欧美日本| 高清不卡一二三区| 久久午夜精品视频| 欧美日韩激情美女| 国产毛片毛片毛片毛片毛片| 亚洲精品自拍视频| 一区二区三区伦理| 国产精品久久久久久久app | 日本三级中国三级99人妇网站| 欧美99久久| 亚洲综合欧美在线| 2欧美一区二区三区在线观看视频| 91狠狠综合久久久| 色综合久久66| 成人精品在线播放| 日韩在线www| 户外露出一区二区三区| 国产精品加勒比| 一区二区中文字| 亚洲国产高清av| 久久综合av免费| 欧美人妻精品一区二区三区 | 日韩中文首页| 人妻有码中文字幕| 成人动漫在线一区| 日日骚一区二区三区| 欧美综合视频在线观看| 亚洲AV成人无码一二三区在线| 欧美美最猛性xxxxxx| 91亚洲精品在看在线观看高清| 日韩福利视频| 久久久噜噜噜久久狠狠50岁| 日本黄色动态图| 午夜不卡av免费| 嫩草影院一区二区| 久久久久久成人精品| 欧美特黄不卡| 91视频 - 88av| 国产精一区二区三区| 国产高潮流白浆| 欧美一区三区四区| 久久综合之合合综合久久| 91精品国产综合久久香蕉| 成人a'v在线播放| 亚洲激情在线观看视频| 久久精品这里都是精品| 亚洲国产精品无码久久久| 精品亚洲一区二区三区在线播放 | 国产日韩精品一区二区| 欧美日韩性在线观看| 久久久精品麻豆| 国产精品区一区二区三区| 中文亚洲av片在线观看| 色伦专区97中文字幕| 9999精品免费视频| 亚洲一区 在线播放| 岛国精品在线观看| 亚洲激情视频一区| 精品视频在线导航| 在线观看精品| 亚洲国产精品影视| 国产精品中文欧美| 国产成人精品a视频一区| 日韩精品中文字幕在线| 欧美成人h版| 一区一区视频| 国产福利91精品| 国产中文字字幕乱码无限| 亚洲黄色成人网| 成人做爰视频www网站小优视频| 亚洲成人自拍| 国产精品自产自拍| 精品91久久久| 中文字幕日韩综合av| 日韩视频一区二区三区四区| 草草视频在线免费观看| 久久精品综合网| 国产美女主播在线观看| 午夜精品久久久99热福利| 国产日产精品_国产精品毛片| 热久久久久久久久| 亚洲成人午夜影院| 在线免费观看黄| 国产精品v欧美精品v日韩| 视频一区二区国产| www.色小姐com| 亚洲欧洲国产精品| 另类视频一区二区三区| 久久精品免费一区二区| 中文字幕一区二区三区在线播放 | 91在线视频网址| 中文字幕免费高清在线观看| 欧美高清视频一区二区| 伊人成综合网yiren22| 亚洲网中文字幕| 日韩欧美中文在线| 日韩黄色影院| 久久99欧美| 国产美女在线观看一区| 岛国av中文字幕| 欧美激情视频在线观看| 欧美色图一区| 成人h动漫精品一区| 欧美一区二区三区视频在线观看|