ES6実装クラスのプライベート変数の書き方をいくつか詳しく説明します

ES6実装クラスのプライベート変数の書き方をいくつか詳しく説明します

プライベート変数のクロージャ実装

プライベート変数は共有されない

new キーワードにより、 person コンストラクター内の this は Tom を指し、新しいスペースが開かれ、すべてのステップが再度実行されます。

クラス Person{ 
    コンストラクタ(名前){ 
      _num = 100 とします。 

      this.name = 名前;
      this.getNum = 関数(){
        _num を返します。
      } 
      this.addNum = 関数(){
        +___numを返す
      } 
    }
  }
  
  const トム = 新しい Person('トム')
  const jack = 新しい Person('jack')
  tom.addNum() 
  コンソールログ(tom.getNum()) //101
  コンソールログ(jack.getNum()) //100 

プライベート変数は共有できる

各関数に新しいプライベート変数が生成されて、一部の変数を共有できないという問題が発生するのを回避するには、このプライベート変数をクラス コンストラクターの外側に配置し、クロージャを通じてこの変数を返し続けます。

const Person = (関数() {
    _num = 100 とします。

    _Personクラスを返す{
      コンストラクタ(名前) {
        this.name = 名前; 
      }
      追加番号() {
       +___numを返す
      }
      取得番号() {
       _numを返す
      } 
    }
  })() 

  const トム = 新しい Person('トム')
  const jack = 新しい Person('jack') 
  tom.addNum()
  コンソールログ(tom.getNum()) //101
  コンソールログ(jack.getNum()) //101

この場合、2 つの方法を混在させると、共有可能なプライベート変数と共有不可能なプライベート変数の 2 種類が存在することになります。

デメリット: インスタンス化中に多くのコピーが追加され、より多くのメモリが消費されます。

シンボルはクラスのプライベート変数を実装します

シンボルの紹介:

一意の値を作成します。すべてのシンボルは互いに同じではありません。シンボルを作成するときに、説明シンボル (「desc」) を追加できます。現在、オブジェクトのキーもシンボルをサポートしています。

const name = シンボル('name')
const person = { // クラス名 [name]: 'www',
  言う(){
    console.log(`name は ${this[name]} です `) 
  } 
} 
人.言う()
console.log(名前)

オブジェクトに Symbol を使用して作成されたキーは、Json によって反復処理およびシリアル化できないため、その主な機能はオブジェクトに一意の値を追加することです。
ただし、getOwnProporitySymbols() を使用してシンボルを取得することができます。
欠点: 新しい構文は、多くのブラウザと互換性がありません。

実装クラスのシンボルプライベート変数

クロージャを使用してシンボルへの参照を作成し、クラスのメソッド領域でこの参照を取得できるようにすることをお勧めします。これにより、すべてのメソッドがコンストラクターに記述され、新しいインスタンスが作成されるたびにメソッドを割り当てるためのスペースが割り当てられ、メモリが無駄になる状況を回避できます。

const Person = (関数() {
 let _num = Symbol('_num: プライベート変数');
 
 _Personクラスを返す{
  コンストラクタ(名前) {
   this.name = 名前;
   this[_num] = 100
  }
  追加番号() {
   ++this[_num]を返す
  }
  取得番号() {
   これを返す[_num]
  } 
 }
})()

const トム = 新しい Person('トム')
const jack = 新しい Person('jack')

コンソールログ(tom.addNum()) //101 
コンソール.log(jack.getNum()) //100

ウィークマップによるプライベート変数の作成

MDNについて

成し遂げる:

const 親 = (関数 () {
 const プライベート = 新しい WeakMap();

 親クラスを返す {
  コンストラクタ() {
   定数私 = {
    データ: 「ここにプライベートデータが入ります」
   };
   privates.set(this, me);
  }
  getP() {
   const me = privates.get(this);
   返して
  }
 } 
})()

p = 新しい親() とする
コンソールログ(p)
コンソールログ(p.getP())

要約する

まとめると、weakmap メソッドはメモリを節約でき、リサイクルが容易で、より多くのブラウザと互換性があるため、最も推奨される実装方法でもあります。

これで、ES6 実装クラスでプライベート変数を記述するいくつかの方法についての記事は終了です。ES6 クラスのプライベート変数の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • ES6シリーズにおけるプライベート変数の実装の詳細な説明

<<:  練習と面接のための Linux シェル スクリプトのヒント 9 つを共有する

>>:  innodb_autoinc_lock_mode の表現と値の選択方法についての簡単な説明

推薦する

MySQLにおけるSQLの実行順序についてのちょっとした質問

今日、仕事中に左結合に関するSQLの問題に遭遇しました。後で解決しましたが、この問題を通じてSQLの...

Vueはテーマ切り替えのための複数のアイデアを実装します

目次テーマを動的に変更する最初の方法: 動的コンポーネント2番目の方法はルーティング分離です要約する...

Ubuntu 18.04 サーバーのパスワードを忘れたり改ざんされた場合にパスワードをリセットする方法

最近、サーバー上のアカウントが2つハッキングされ、パスワードが改ざんされました。幸い、まだ使えるアカ...

MySQL Shellの紹介とインストール

目次01 レプリ​​カセットアーキテクチャ02 MySQL Shellの紹介とインストール03 My...

Apache SkyWalking アラーム設定ガイドの詳細な説明

アパッチ スカイウォーキングApache SkyWalking は、マイクロサービス、クラウド ネイ...

jsはタイトルと説明のキーワードを検出し、見つかった場合は置換するか他のページにジャンプします。

キーワード 一般タイトルには、クラック、キー、シリアル番号、キージェネレータなどの単語を含めることは...

ReactでCSSスタイルを動的に変更する2つの方法の詳細な説明

最初の方法: デモとしてボタンをクリックしてテキストを表示または非表示にするクラスを動的に追加します...

JavaScript における async と await の使い方とメソッド

JS の async 関数と await キーワード 関数ヘルワールド() { 「こんにちは!美しい...

ミニプログラムはリストのカウントダウン機能を実装します

この記事の例では、ミニプログラムでリストカウントダウンを実装するための具体的なコードを参考までに共有...

Angularコンポーネントライフサイクルの詳細説明(I)

目次概要1. フックの呼び出し順序2. onChangesフック3. 変更検出メカニズムとDoChe...

興味深いカウントダウン効果を実現するjs

js興味深いカウントダウンケース、参考までに、具体的な内容は次のとおりですコード: <!DO...

js キャンバスは角丸画像を実現します

この記事では、角を丸くするためのjsキャンバスの具体的なコードを参考までに紹介します。具体的な内容は...

MySQLトリガーの簡単な使用例

この記事では、例を使用して MySQL トリガーの簡単な使用方法を説明します。ご参考までに、詳細は以...

MySQL のストアド プロシージャを使用して 100 万件のレコードをすばやく生成する方法

序文テストを行う際、大量のデータによる負荷に耐えるプロジェクトの能力をテストするために、通常はテスト...

Alibaba Cloud Server の詳細な展開 (グラフィック チュートリアル)

最近、Web 開発のフロントエンドとバックエンドの技術を学んだので、その後の管理を容易にするためにプ...