亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

詳解JavaScript 新語法之Class 的私有屬性與私有方法

2024-05-06 16:50:13
字體:
來源:轉載
供稿:網友

譯者按: 為什么偏要用 # 符號?

原文:JavaScript's new #private class fields
•譯者:Fundebug

本文采用意譯,版權歸原作者所有

proposal-class-fieldsproposal-private-methods定義了 Class私有屬性以及私有方法,這 2 個提案已經處于 Stage 3,這就意味著它們已經基本確定下來了,等待被加入到新的 ECMAScript 版本中。事實上,最新的 Chrome 已經支持了 Class 私有屬性。

那么,對于 Class 的私有屬性與私有方法,它們究竟是什么呢?它們是怎樣工作的?為什么要使用#符號來定義呢?

Class 的私有屬性語法如下:

class Point { #x; #y; constructor(x, y) {  this.#x = x;  this.#y = y; } equals(point) {  return this.#x === point.#x && this.#y === point.#y; }}

我們可以將其語法理解為 2 個部分:

•定義 Class 私有屬性
•引用 Class 私有屬性

定義 Class 私有屬性

私有屬性與公共屬性的定義方式幾乎是一樣的,只是需要在屬性名稱前面添加#符號:

class Foo { publicFieldName = 1; #privateFieldName = 2;}

定義私有屬性的時候也可以不用賦值:

class Foo { #privateFieldName;}

引用 Class 私有屬性

引用私有屬性也只需要使用#就好了。

class Foo { publicFieldName = 1; #privateFieldName = 2; add() {  return this.publicFieldName + this.#privateFieldName; }}

其中,this.#可以簡化,去掉 this 也沒問題,下面兩種寫法是等價的:

method() { #privateFieldName;}method() { this.#privateFieldName;}

在 Class 定義中引用 Class 實例的私有屬性

對于私有屬性,我們是不可以直接通過 Class 實例來引用的,這也是私有屬性的本來含義。但是有一種情況除外,在 Class 定義中,我們可以引用 Class 實例的私有屬性:

class Foo { #privateValue = 42; static getPrivateValue(foo) {  return foo.#privateValue; }}

Foo.getPrivateValue(new Foo()); // >> 42

其中,foo是Foo的實例,在 Class 定義中,我們可以通過 foo 來引用私有屬性#privateValue。

Class 的私有方法

Class 的私有屬性是提案proposal-class-fields的一部分,這個提案只關注 Class 的屬性,它并沒有對 Class 的方法進行任何修改。而 Class 的私有方法是提案proposal-class-fields的一部分。

Class 的私有方法語法如下:

class Foo { constructor() {  this.#method(); } #method() {  // ... }}

我們也可以將函數賦值給私有屬性:

class Foo { constructor() {  this.#method(); } #method = () => {  // ... };}

封裝(隱藏)私有屬性

我們不能直接通過 Class 實例引用私有屬性,我們只能在 Class 定義中引用它們:

class Foo { #bar; method() { this.#bar; // Works }}let foo = new Foo();foo.#bar; // Invalid!

另外,要做到真正的私有的話,我們應該無法檢測這個私有屬性是否存在,因此,我們需要允許定義同名的公共屬性:

class Foo { bar = 1; // public bar #bar = 2; // private bar}

如果我們不允許公共屬性與私有屬性同名,我們則可以通過給同名的公共屬性復制監測該私有屬性是否存在:

foo.bar = 1; // Error: `bar` is private! (報錯,說明私有屬性存在)

不報錯也行:

foo.bar = 1;foo.bar; // `undefined` (賦值失敗,說明私有屬性存在)

對于 subclass 應該同樣如此,它也允許公共屬性與私有屬性同名:

class Foo { #fieldName = 1;}class Bar extends Foo { fieldName = 2; // Works!}

關于 Class 私有屬性的封裝,可以參考Why is encapsulation a goal of this proposal?。

為什么使用#符號?

很多人都有一個疑問,為什么 JS 不能學習其他語言,使用private來定義私有屬性和私有方法?為什么要使用奇怪的#符號?

使用 private 的話,代碼要舒服很多:

class Foo { private value; equals(foo) {  return this.value === foo.value; }}

 

為什么不使用 private 來定義私有屬性?

很多語言使用 private 來定義私用屬性,如下:

class EnterpriseFoo { public bar; private baz; method() {  this.bar;  this.baz; }}

 

對于這些語言屬性,私用屬性和公共屬性的引用方式是相同的,因此他們可以使用 private 來定義私有屬性。

但是,對于 JavaScript 來說,我們不能使用 this.field 來引用私有屬性(我接下來會解釋原因),我們需要在語法層面上區分私有屬性和公共屬性。在定義和引用私有屬性的時候,使用#符號,私有屬性與公共屬性可以很好地區分開來。

為什么引用私有屬性的時候需要#符號?

引用私有屬性的時候,我們需要this.#field,而不是this.field,原因如下:

•因為我們需要封裝私有屬性,我們需要允許公共屬性與私有屬性同名,因此私有屬性與公共屬性的引用方式必須不一樣。這一點我們在前文已經詳述。
•公共屬性可以通過this.field以及this['field']來引用,但是私有屬性不能支持this['field']這種方式,否則會破壞私有屬性的隱私性,示例如下:

class Dict extends null {  #data = something_secret;  add(key, value) {    this[key] = value;  }  get(key) {    return this[key];  }}new Dict().get("#data"); // 返回私有屬性

 

因此,私有屬性與公共屬性的引用方式必須不一樣,否則會破壞this['field']語法。

•私有屬性與公共屬性的引用方式一樣的話,會導致我們每次都需要去檢查屬性是公共的還是私有的,這會造成嚴重的性能問題。

這篇文章遵循Creative Commons Attribution 4.0 International License。

參考

Why is encapsulation a goal of this proposal?

總結

以上所述是小編給大家介紹的JavaScript 新語法之Class 的私有屬性與私有方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品国模在线| 亚洲成人aaa| 国产成人av在线播放| 亚洲毛茸茸少妇高潮呻吟| 日本亚洲精品在线观看| 91亚洲国产成人精品性色| 亚洲欧美中文日韩v在线观看| 欧美小视频在线| 欧美性生活大片免费观看网址| 亚洲国产91精品在线观看| 欧美xxxx14xxxxx性爽| 日韩欧美在线字幕| 欧美高清在线视频观看不卡| 亚州成人av在线| 国外日韩电影在线观看| 久久69精品久久久久久国产越南| 色在人av网站天堂精品| 亚洲日本欧美中文幕| 国产精品自产拍在线观看中文| 国产ts人妖一区二区三区| 日韩美女在线看| 国产精品第10页| 最近2019年中文视频免费在线观看| 成人黄色av播放免费| 欧美高清视频在线观看| 日本19禁啪啪免费观看www| 少妇激情综合网| 91在线免费观看网站| 777国产偷窥盗摄精品视频| 国产日韩欧美中文| 91国在线精品国内播放| 亚洲高清不卡av| 国产精品久久久999| 亚洲国产精品久久久久秋霞蜜臀| 亚洲最大福利视频网站| 国产一区二区日韩| 亚洲女人被黑人巨大进入| 日韩黄在线观看| 在线观看欧美视频| 91精品在线观看视频| 亚洲精品网站在线播放gif| 欧美极品少妇xxxxⅹ裸体艺术| 欧美日韩中文在线观看| 久久精品国产免费观看| 日本成人精品在线| 久久激情五月丁香伊人| 欧美天天综合色影久久精品| 国产精品成人在线| 成人黄色av网| 久久久女人电视剧免费播放下载| 国产精品扒开腿做爽爽爽的视频| 久久精品电影网| 国产精品美女免费看| 欧美影院成年免费版| 欧美成人免费一级人片100| 精品久久久免费| 欧美网站在线观看| 色噜噜狠狠狠综合曰曰曰88av| 亚洲无线码在线一区观看| 日韩美女视频免费在线观看| 中文在线不卡视频| 91麻豆国产语对白在线观看| 欧美一性一乱一交一视频| 欧美性20hd另类| 中文字幕一区电影| 在线播放国产一区中文字幕剧情欧美| 国产精品国产三级国产aⅴ浪潮| 欧美日韩另类字幕中文| 在线观看欧美日韩国产| 日韩免费av片在线观看| 亚洲无亚洲人成网站77777| 欧美老妇交乱视频| 国产在线视频2019最新视频| 欧美在线一区二区三区四| 中文字幕日韩在线视频| 国产精品视频自在线| 欧美日韩在线视频一区| 国产欧美日韩专区发布| 日韩精品视频中文在线观看| 欧美一级大片在线免费观看| 日韩亚洲欧美中文在线| 国产成人精品最新| 一区二区三区日韩在线| 国模gogo一区二区大胆私拍| 日韩69视频在线观看| 热久久这里只有| 丰满岳妇乱一区二区三区| 国产精品一区二区在线| 91久久精品日日躁夜夜躁国产| 国产精品欧美一区二区三区奶水| 欧洲亚洲免费在线| 国产精品成人v| 中国日韩欧美久久久久久久久| 97视频国产在线| 久久久久中文字幕2018| 91美女福利视频高清| 亚洲欧美在线免费观看| 亚洲欧美国产视频| 欧美xxxx18性欧美| 欧美性xxxxx极品| 激情久久av一区av二区av三区| 最近中文字幕mv在线一区二区三区四区| 亚洲va欧美va在线观看| 欧美与黑人午夜性猛交久久久| 欧美日韩激情网| 久久综合伊人77777蜜臀| 日韩亚洲欧美成人| 国产一区二区三区网站| 欧美激情喷水视频| 97国产精品人人爽人人做| 久久久999精品免费| 中文字幕亚洲自拍| 91亚洲精品久久久| 超碰97人人做人人爱少妇| 亚洲人成网站在线播| 亚洲国产日韩精品在线| 夜夜嗨av色综合久久久综合网| 国产日韩av在线| 91影院在线免费观看视频| 亚洲欧美成人网| 91香蕉嫩草神马影院在线观看| 国产欧美一区二区白浆黑人| 91香蕉嫩草影院入口| 欧美精品激情视频| 国产中文日韩欧美| 68精品国产免费久久久久久婷婷| 亚洲国产精品一区二区三区| 亚洲欧美日韩第一区| 97精品视频在线观看| 国产日韩精品在线观看| 免费91麻豆精品国产自产在线观看| 日韩成人xxxx| 亚洲国产精品网站| 亚洲国模精品私拍| 亚洲最新av在线网站| 欧美视频在线免费看| 97国产在线视频| 日日狠狠久久偷偷四色综合免费| 在线观看欧美日韩国产| 欧美激情性做爰免费视频| 亚洲电影免费观看| 日韩精品999| 欧美在线性视频| 午夜精品视频网站| 国产精品www网站| 亚洲国产精品99久久| 日韩av中文字幕在线免费观看| 最近中文字幕2019免费| 高清欧美一区二区三区| 51视频国产精品一区二区| 亚洲影院污污.| 国产91成人video| 91青草视频久久| 国产成+人+综合+亚洲欧洲| 国产精品7m视频| 亚洲人在线视频| 欧美性猛交xxxxx免费看| 国产suv精品一区二区| 精品国产一区二区三区久久| 日韩欧美在线视频日韩欧美在线视频| 久久国产精品99国产精| 欧美高清自拍一区| 久久久久久国产免费| 国模精品视频一区二区|