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 の表現と値の選択方法についての簡単な説明

推薦する

CSS3でよく使われるスタイルの詳しい解説[基本的なテキストとフォントのスタイル]

概要: Web ページをより美しく見せるために、ここでは CSS3 でよく使用されるスタイルをいくつ...

MySQL 5.7 でパスワードを変更するときに発生する ERROR 1054 (42S22) の解決方法

MySQL 5.7 を新しくインストールしました。ログインすると、パスワードが間違っているというメッ...

Linux仮想マシンを作成し、仮想マシンネットワークを設定する方法に関するVMwareの詳細なチュートリアル

VMware で Linux 仮想マシンを作成し、VMware と仮想マシンのネットワークを設定する...

CentOS MySQLデータベースのスケジュールバックアップを実装する方法

次のスクリプトは、MySQLデータベース全体のスケジュールされたバックアップに使用されます。 mys...

Nginx プロキシを使用してインターネットを閲覧する方法

私は通常、Tomcatや他のアプリケーションのリバースプロキシとしてnginxを使用しています。実際...

MySQL トランザクション分離レベルと MVCC の詳細な説明

目次トランザクション分離レベル同時トランザクション実行中に発生した問題SQL標準の4つの分離レベルM...

DD DT DLタグの使用例

通常は <ul><li> タグを使用しますが、dd タグと dt タグも便利...

Vue el-date-picker 動的制限時間範囲ケースの詳細な説明

2つの状況がある1. 開始時間と終了時間が同じボックス内にあります(今月のみ限定) 2. 開始時間と...

HTMLとCSSを使用して、自分だけの暖かい男「Dabai」を作成します

最終結果はこんな感じです、かわいいでしょう… PS: HTML と CSS の知識があればベストです...

Jenkins統合Dockerプラグインの問題を解決するいくつかの方法

目次背景質問1エラー 2エラー 3エラー4要約する背景テスト環境では、docker プラグインを統合...

mysql 行列変換サンプルコード

1. 需要3 つのテーブルがあります。一定期間にわたるさまざまな抗生物質感受性の結果、つまり rep...

CSSボックスの表示/非表示とトップレイヤーの実装コード

.imgbox{ 幅: 1200ピクセル; 高さ: 612px; 右マージン: 自動; 左マージン...

MySQL データ定義言語 DDL の基本ステートメント

MySQL DDL ステートメントDDL、DMLとは何ですか。 DDL はデータ定義言語であり、CR...

MySQL 外部キー (FOREIGN KEY) の使用例の詳細な説明

はじめに: すべてのデータを 1 つのテーブルに保存することのデメリット表の構成構造は複雑で不明瞭で...

負荷分散の基礎知識とnginxを使用した負荷分散の簡単な例

Nginx は、一般的に 7 層の負荷分散に使用できます。この記事では、負荷分散に関する基本的な知識...