国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript 新語(yǔ)法詳解:Class 的私有屬性與私有方法

opengps / 1288人閱讀

摘要:事實(shí)上,最新的已經(jīng)支持了私有屬性。而的私有方法是提案的一部分。自從年雙十一正式上線,累計(jì)處理了億錯(cuò)誤事件,付費(fèi)客戶有金山軟件百姓網(wǎng)等眾多品牌企業(yè)。

譯者按: 為什么偏要用#符號(hào)?

原文:JavaScript"s new #private class fields

譯者:Fundebug

本文采用意譯,版權(quán)歸原作者所有

proposal-class-fields與proposal-private-methods定義了 Class 的私有屬性以及私有方法,這 2 個(gè)提案已經(jīng)處于 Stage 3,這就意味著它們已經(jīng)基本確定下來(lái)了,等待被加入到新的 ECMAScript 版本中。事實(shí)上,最新的 Chrome 已經(jīng)支持了 Class 私有屬性。

那么,對(duì)于 Class 的私有屬性與私有方法,它們究竟是什么呢?它們是怎樣工作的?為什么要使用#符號(hào)來(lái)定義呢?

Class 的私有屬性語(yǔ)法如下:

class Point {
    #x;
    #y;

    constructor(x, y) {
        this.#x = x;
        this.#y = y;
    }

    equals(point) {
        return this.#x === point.#x && this.#y === point.#y;
    }
}

我們可以將其語(yǔ)法理解為 2 個(gè)部分:

定義 Class 私有屬性

引用 Class 私有屬性

定義 Class 私有屬性

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

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

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

class Foo {
    #privateFieldName;
}
引用 Class 私有屬性

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

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

其中,this.#可以簡(jiǎn)化,去掉 this 也沒(méi)問(wèn)題,下面兩種寫法是等價(jià)的:

method() {
  #privateFieldName;
}
method() {
  this.#privateFieldName;
}
在 Class 定義中引用 Class 實(shí)例的私有屬性

對(duì)于私有屬性,我們是不可以直接通過(guò) Class 實(shí)例來(lái)引用的,這也是私有屬性的本來(lái)含義。但是有一種情況除外,在 Class 定義中,我們可以引用 Class 實(shí)例的私有屬性:

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

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

其中,fooFoo的實(shí)例,在 Class 定義中,我們可以通過(guò) foo 來(lái)引用私有屬性#privateValue。

Class 的私有方法

Class 的私有屬性是提案proposal-class-fields的一部分,這個(gè)提案只關(guān)注 Class 的屬性,它并沒(méi)有對(duì) Class 的方法進(jìn)行任何修改。而 Class 的私有方法是提案proposal-class-fields的一部分。

Class 的私有方法語(yǔ)法如下:

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

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

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

    #method = () => {
        // ...
    };
}
封裝(隱藏)私有屬性

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

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

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

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

如果我們不允許公共屬性與私有屬性同名,我們則可以通過(guò)給同名的公共屬性復(fù)制監(jiān)測(cè)該私有屬性是否存在:

foo.bar = 1; // Error: `bar` is private! (報(bào)錯(cuò),說(shuō)明私有屬性存在)

不報(bào)錯(cuò)也行:

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

對(duì)于 subclass 應(yīng)該同樣如此,它也允許公共屬性與私有屬性同名:

class Foo {
    #fieldName = 1;
}

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

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

為什么使用#符號(hào)?

很多人都有一個(gè)疑問(wèn),為什么 JS 不能學(xué)習(xí)其他語(yǔ)言,使用private來(lái)定義私有屬性和私有方法?為什么要使用奇怪的#符號(hào)?

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

class Foo {
  private value;

  equals(foo) {
    return this.value === foo.value;
  }
}
為什么不使用 private 來(lái)定義私有屬性?

很多語(yǔ)言使用 private 來(lái)定義私用屬性,如下:

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

對(duì)于這些語(yǔ)言屬性,私用屬性和公共屬性的引用方式是相同的,因此他們可以使用 private 來(lái)定義私有屬性。

但是,對(duì)于 JavaScript 來(lái)說(shuō),我們不能使用 this.field 來(lái)引用私有屬性(我接下來(lái)會(huì)解釋原因),我們需要在語(yǔ)法層面上區(qū)分私有屬性和公共屬性。在定義和引用私有屬性的時(shí)候,使用#符號(hào),私有屬性與公共屬性可以很好地區(qū)分開(kāi)來(lái)。

為什么引用私有屬性的時(shí)候需要#符號(hào)?

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

因?yàn)槲覀冃枰庋b私有屬性,我們需要允許公共屬性與私有屬性同名,因此私有屬性與公共屬性的引用方式必須不一樣。這一點(diǎn)我們?cè)谇拔囊呀?jīng)詳述。

公共屬性可以通過(guò)this.field以及this["field"]來(lái)引用,但是私有屬性不能支持this["field"]這種方式,否則會(huì)破壞私有屬性的隱私性,示例如下:

class Dict extends null {
    #data = something_secret;
    add(key, value) {
        this[key] = value;
    }
    get(key) {
        return this[key];
    }
}

new Dict().get("#data"); // 返回私有屬性

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

私有屬性與公共屬性的引用方式一樣的話,會(huì)導(dǎo)致我們每次都需要去檢查屬性是公共的還是私有的,這會(huì)造成嚴(yán)重的性能問(wèn)題。

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

參考

Why is encapsulation a goal of this proposal?

關(guān)于Fundebug

Fundebug專注于JavaScript、微信小程序、微信小游戲、支付寶小程序、React Native、Node.js和Java線上應(yīng)用實(shí)時(shí)BUG監(jiān)控。 自從2016年雙十一正式上線,F(xiàn)undebug累計(jì)處理了10億+錯(cuò)誤事件,付費(fèi)客戶有Google、360、金山軟件、百姓網(wǎng)等眾多品牌企業(yè)。歡迎大家免費(fèi)試用!

版權(quán)聲明

轉(zhuǎn)載時(shí)請(qǐng)注明作者Fundebug以及本文地址:
https://blog.fundebug.com/201...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/103786.html

相關(guān)文章

  • ES5原型鏈和ES6類實(shí)現(xiàn)詳解

    摘要:類才支持實(shí)例屬性代碼解讀上面暫時(shí)只是概念性的寫法,事實(shí)上,的類只是一個(gè)原型鏈的語(yǔ)法糖而已,主要是從寫法上更接近于面相對(duì)象的類而已,另外一個(gè)作用就是區(qū)分的構(gòu)造函數(shù)和函數(shù)之間的區(qū)分。 ES5的原型鏈和ES6的類實(shí)現(xiàn)詳解 JavaScript最初設(shè)計(jì)時(shí)受到了面相對(duì)象編程的影響,從而引入了new關(guān)鍵字,來(lái)實(shí)例化對(duì)象。而在ES5中new后面跟著的是構(gòu)造函數(shù)(也是函數(shù)),而到了ES6則改成了cla...

    王偉廷 評(píng)論0 收藏0
  • ES5原型鏈和ES6類實(shí)現(xiàn)詳解

    摘要:類才支持實(shí)例屬性代碼解讀上面暫時(shí)只是概念性的寫法,事實(shí)上,的類只是一個(gè)原型鏈的語(yǔ)法糖而已,主要是從寫法上更接近于面相對(duì)象的類而已,另外一個(gè)作用就是區(qū)分的構(gòu)造函數(shù)和函數(shù)之間的區(qū)分。 ES5的原型鏈和ES6的類實(shí)現(xiàn)詳解 JavaScript最初設(shè)計(jì)時(shí)受到了面相對(duì)象編程的影響,從而引入了new關(guān)鍵字,來(lái)實(shí)例化對(duì)象。而在ES5中new后面跟著的是構(gòu)造函數(shù)(也是函數(shù)),而到了ES6則改成了cla...

    Warren 評(píng)論0 收藏0
  • 詳解JS類概念實(shí)現(xiàn)

    摘要:它繼承自構(gòu)造函數(shù)被執(zhí)行,相應(yīng)的參數(shù)會(huì)被傳入,同時(shí)上下文會(huì)指向這個(gè)新的實(shí)例除非明確返回值,否則返回新的實(shí)例至此,我們實(shí)現(xiàn)了里面的類對(duì)象和屬性的概念,和有相同的屬性,但是值并不相同即屬性是私有的。 眾所周知,JS并沒(méi)有類(class)的概念,雖然說(shuō)ES6開(kāi)始有了類的概念,但是,這并不是說(shuō)JS有了像Ruby、Java這些基于類的面向?qū)ο笳Z(yǔ)言一樣,有了全新的繼承模型。ES6中的類,僅僅只是基于...

    _ipo 評(píng)論0 收藏0
  • ECMASCript 2019可能會(huì)有哪些特性?

    摘要:可能不會(huì)包括所有的語(yǔ)法提案。事實(shí)上,有些提案已經(jīng)被擱置很多年了。因此,很可能也會(huì)在今年月份發(fā)布。 譯者按: 又過(guò)了1年... 原文:Whats New in JavaScript for 2019 譯者: Fundebug 為了保證可讀性,本文采用意譯而非直譯。另外,本文版權(quán)歸原作者所有,翻譯僅用于學(xué)習(xí)。 最近這些年,ECMASCript標(biāo)準(zhǔn)發(fā)展節(jié)奏非常穩(wěn)定,每年都會(huì)發(fā)布新的特...

    tuantuan 評(píng)論0 收藏0
  • Java基礎(chǔ)-內(nèi)部類詳解

    摘要:序內(nèi)部類是定義在另一個(gè)類內(nèi)部的類。之所以定義在內(nèi)部是因?yàn)閮?nèi)部類有一些普通類沒(méi)有的特權(quán),可以方便實(shí)現(xiàn)一些需求。還有明確的使用內(nèi)部類的構(gòu)建函數(shù)。在以后,使用表達(dá)式會(huì)比匿名內(nèi)部類更加方便。 我的博客 轉(zhuǎn)載請(qǐng)注明原創(chuàng)出處。 序 內(nèi)部類(inner class)是定義在另一個(gè)類內(nèi)部的類。之所以定義在內(nèi)部是因?yàn)閮?nèi)部類有一些普通類沒(méi)有的特權(quán),可以方便實(shí)現(xiàn)一些需求。 內(nèi)部類 先來(lái)看一個(gè)簡(jiǎn)單的例子...

    graf 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<