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

推薦する

ウェブデザインと制作におけるハイパーリンクの効果の向上

ハイパーリンクを使用すると、ページからページへ、またはサイトからサイトへ瞬時に移動できます。このよう...

HTML で #include ファイルを使用する例

a.htmとb.htmの2つのファイルがあります。同じディレクトリ内のa.htmの内容は次のとおりで...

Linux で大きなファイルの内容を消去または削除する 5 つの方法

Linux ターミナルでファイルを操作しているときに、Linux コマンドライン エディターでファイ...

nginx ベースのブラウザネゴシエーションキャッシュプロセスの詳細な説明

この記事は主に、nginx に基づいてブラウザネゴシエーションキャッシュを設定する詳細なプロセスを紹...

MySQL挿入パフォーマンスを最適化する方法の例

MySQL パフォーマンスの最適化MySQL パフォーマンスの最適化とは、リソースを合理的に配置し、...

CSS3は、欠けた角の長方形、折り畳まれた角の長方形、欠けた角の境界線を実装しています。

序文数日前、偶然、コーナーの四角形が欠落している機能に遭遇しました。最初に頭に浮かんだのは、必要な場...

CentOS7.x のアンインストールとインストール MySQL5.7 の操作手順とエンコード形式の変更方法

1. MySQL 5.7 のアンインストール1.1查看yum是否安裝過mysql CD yum li...

MySQL Index Pushdown (ICP) とは何かを理解するための記事

目次1. はじめに2. 原則III. 実践3.1 インデックスプッシュダウンを使用しない3.2 イン...

Vueはプログレスバーの変更効果を実現します

この記事ではVueを使ってプログレスバーの変更を簡単に実装してみましたので参考にしてください。具体的...

MySQLの読み書き分離により挿入後にデータが選択されなくなる問題を解決

MySQLは独立した書き込み分離を設定します。コードに次のものを書くと問題が発生する可能性があります...

IE6 ウェブページ作成リファレンス IE6 デフォルトスタイル

これは実際には IE の公式ドキュメントではありません。他の人が実践を通じて開発した IE6 のデフ...

phpmyadmin を使用して MySQL 権限を設定する方法

目次ステップ 1: root ユーザーとしてログインします。ステップ 2: 新しいデータ テーブルを...

MySQL における識別子の大文字と小文字の区別の問題の詳細な分析

MySQL では、テーブル名の大文字と小文字の区別の問題が発生する可能性があります。実際、これはプラ...

CSS3のfocus-withinセレクタの使用

擬似要素と擬似クラスところで、まずは疑似クラスセレクターと疑似要素セレクターについておさらいしておき...

MySQL クエリのパケットが大きすぎる問題と解決策

問題の説明:エラーメッセージ:原因: com.mysql.jdbc.PacketTooBigExce...