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

推薦する

Centos7 に Nginx 統合 Lua サンプル コードをインストール

序文私が使用しているパソコンはMacで、OSはmacOS Mojaveです。コンピュータに仮想マシン...

MySQLのワークベンチ例の詳細な説明

MySQL Workbench - モデリングおよび設計ツール1. モデルは、最も効果的で高性能なデ...

MySQLクエリトランザクション処理へのノード接続の実装

目次トピックmysqlの追加、削除、変更、クエリを入力しますMySQL トランザクション処理私は M...

Docker を使ってゼロから SOLO 個人ブログを構築する方法

目次1. 環境整備2. Dockerをインストールする3. MySQLマスタースレーブデータベースを...

ViteでReactプロジェクトを構築する方法

目次序文Viteプロジェクトを作成する改修プロジェクトディレクトリの規則その他の構成序文毎日鳩、火ば...

HTML フォーマットの json のサンプルコード

さっそく、コードを直接投稿します。具体的なコードは次のとおりです。 <!DOCTYPE htm...

mysql 基本操作文コマンドの詳細な説明

1. MySQLに接続するフォーマット: mysql -h ホストアドレス -u ユーザー名 -p ...

Javascript における分割代入構文の詳細な説明

序文ES6 で初めて導入された「構造化代入構文」を使用すると、配列やオブジェクトの値を異なる変数に挿...

MySQLトリガーの使用

目次1. トリガーの紹介1. トリガーとは何ですか? 2. トリガーの特徴2. トリガーを作成する1...

HTMLはa要素hrefのURLリンクを自動的に更新したり新しいウィンドウを開いたりする機能を実装する

場合によっては、次のような機能を実装したいことがあります。リンクをクリックします。リンクがブラウザで...

xshellを使用してLinuxサーバーに接続する

xshellを使用してLinuxに接続する利点Windows環境でLinuxを直接操作できるインター...

MySQL グラフィカル管理ツール Navicat のインストール手順

目次序文1. 全員にインストールパッケージを用意する2. Navicatをインストールし、Navic...

JavaScript ベースのシンプルなカルーセルの実装

この記事では、シンプルなカルーセルを実装するためのJavaScriptの具体的なコードを参考までに紹...

Dockerfile の一般的なコマンドの概要

構文の構成: 1 注釈情報2 コマンド --- パラメータ [通常は大文字 | 実際には大文字と小文...

MySQL ベースのシーケンス実装方法

チームは新しいフレームを交換しました。すべての新しいビジネスでは、新しいフレームワークと新しいデータ...