JavaScript でプライベート変数を宣言する 2 つの方法

JavaScript でプライベート変数を宣言する 2 つの方法

序文

JavaScript は、キーワードを使用してプライベート変数を宣言できる他の言語とは異なります。
JavaScript でプライベート変数を宣言する方法は 2 つあります。1 つはクロージャを使用する方法で、もう 1 つは WeakMap を使用する方法です。

閉鎖

クロージャを記述する方法は多数あります。たとえば、次のようになります。
他の関数のスコープにアクセスできる関数。
内部関数が外部関数スコープにアクセスするためのブリッジ。
......

クロージャを使用してプライベート変数を構築するロジックは次のとおりです。
1. 外部関数内で変数と内部関数を宣言します。
2. 内部関数を使用して変数の値にアクセスしたり、変数の値を変更したりします。
3. 外側の関数で内側の関数を返します。

関数の外側(){
	val = 123 とします。
	関数内部(){
		戻り値:
	}
	中に戻る;
}
console.log(外部()());//123

上記の例は、クロージャを使用してプライベート変数を構築するロジックの概要を示していますが、プライベート変数の重要性を反映するには十分ではありません。const 変数でも上記のコードの効果を実現できます。

// 同じものにアクセスすることはできますが、変更することはできません。上記のコードの効果が得られます。const val = 123;
コンソール.log(val);//123

次のコードは、プライベート変数の重要性を具体的に反映しています。

関数 person(){ 
 _name = '不明' とします。
 _age = 18 とします。
 _sex = 'man' とします。

 関数setName(名前){
  _name = 名前 || '不明';
 }

 関数 getName(){
  _name を返します。
 }

 関数setAge(年齢){
  if(typeof age === 'number'){
   _age = Math.floor(年齢);
  }それ以外{
   エラーをスローします("typeof age !== 'number'");
  }
 }

 関数 getAge(){
  _age を返します。
 }

 関数setSex(性別){
  if(性別 === '男性' || 性別 === 1){
   _sex = '男性';
  }そうでない場合(性別 === '女性' || 性別 === 0){
   _sex = '女性';
  }それ以外{
   Error('入力エラー')をスローします。
  }
 }

 関数 getSex(){
  _sex を返します。
 }

 戻る {
  setName: setName、
  取得名: 取得名、
  年齢設定: 年齢設定、
  年齢取得: 年齢取得、
  セックスの設定: セックスの設定、
  ゲットセックス : ゲットセックス
 }
}

xiaoming = person() とします。
xiaohong = person() とします。
xiaoming.setName('xiaoming');
xiaohong.setName('xiaohong');
console.log('xiaoming 名: ' + xiaoming.getName());//xiaoming 名: xiaoming
console.log('xiaohong name : ' + xiaohong.getName());//xiaohong name : xiaohong

xiaoming.setAge(19.3333);
xiaohong.setAge('16');//キャッチされないエラー: typeof age !== 'number'
console.log('xiaoming 年齢: ' + xiaoming.getAge());//xiaoming 年齢: 19
console.log('xiaohong 年齢: ' + xiaohong.getAge());//xiaohong 年齢: 18


xiaoming.setSex(1);
xiaohong.setSex('女性');
console.log('xiaoming sex : ' + xiaoming.getSex());//xiaoming sex : 男性
console.log('xiaohong sex : ' + xiaohong.getSex());//xiaohong sex : 女性

上記のコードから、_name、_age、_sex の 3 つの変数の値を設定または取得する場合は、setName、getName、setAge、getAge、setSex、getSex などの固定メソッドのみを使用でき、すべての setter メソッドでは、仮パラメータが判断されることがわかります。これは、オブジェクトに対するすべての操作が制御されることを意味し、弱い型付け言語としての JavaScript の悪影響がある程度緩和されます。

弱いマップ

WeakMap についてよく知らない場合は、まず WeakMap の詳細な紹介を読んでみてください。
ここでの重要な点は、WeakMap のキーは列挙可能ではないということです。

名前WeakMapを新しいWeakMap()にします。
ageWeakMap = new WeakMap(); とします。
sexWeakMap = new WeakMap(); とします。

関数 person(){
 _hash = Object.create(null); とします。
 nameWeakMap.set(_hash,'不明');
 ageWeakMap.set(_hash,18);
 sexWeakMap.set(_hash, '男性');
 関数setName(名前){
  nameWeakMap.set(_hash,name || '不明');
 }

 関数 getName(){
  nameWeakMap.get(_hash) を返します。
 }

 関数setAge(年齢){
  if(typeof age === 'number'){
   ageWeakMap.set(_hash,Math.floor(age));
  }それ以外{
   エラーをスローします("typeof age !== 'number'");
  }
 }

 関数 getAge(){
  ageWeakMap.get(_hash) を返します。
 }

 関数setSex(性別){
  if(性別 === '男性' || 性別 === 1){
   sexWeakMap.set(_hash, '男性');
  }そうでない場合(性別 === '女性' || 性別 === 0){
   sexWeakMap.set(_hash,'女性');
  }それ以外{
   Error('入力エラー')をスローします。
  }
 }

 関数 getSex(){
  sexWeakMap.get(_hash); を返します。
 }

 戻る {
  名前の設定:名前の設定、
  取得名: 取得名、
  年齢設定: 年齢設定、
  年齢取得: 年齢取得、
  セックスの設定: セックスの設定、
  ゲットセックス : ゲットセックス
 }
}

xiaoming = person() とします。
xiaohong = person() とします。
xiaoming.setName('xiaoming');
xiaohong.setName('xiaohong');
console.log('xiaoming 名: ' + xiaoming.getName());//xiaoming 名: xiaoming
console.log('xiaohong name : ' + xiaohong.getName());//xiaohong name : xiaohong

xiaoming.setAge(19.3333);
xiaohong.setAge('16');//キャッチされないエラー: typeof age !== 'number'
console.log('xiaoming 年齢: ' + xiaoming.getAge());//xiaoming 年齢: 19
console.log('xiaohong 年齢: ' + xiaohong.getAge());//xiaohong 年齢: 18


xiaoming.setSex(1);
xiaohong.setSex('女性');
console.log('xiaoming sex : ' + xiaoming.getSex());//xiaoming sex : 男性
console.log('xiaohong sex : ' + xiaohong.getSex());//xiaohong sex : 女性

プライベート変数を構築することでも同じ効果が得られます。ちなみに、WeakMap はクラス内のプライベート変数を構築するために使用されます。

結論

この記事は、JavaScript でプライベート変数を構築する方法と機能について私が知っていることだけを記したものです。間違いや漏れがありましたらご指摘ください。よろしくお願いいたします。

上記は、JavaScript でプライベート変数を宣言する 2 つの方法の詳細です。JavaScript でプライベート変数を宣言する方法の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • JavaScript 上級編 (I) 変数宣言の改善例の分析
  • js の let と var 宣言変数の違いの詳細な説明
  • js 変数宣言で var を使用する場合と使用しない場合の違いの詳細な説明
  • JavaScript 関数宣言と変数宣言の違い
  • JavaScript 変数宣言の簡単な分析
  • JavaScript での変数宣言をご存知ですか?

<<:  MySQL 5.7.17 のインストールと設定方法のグラフィックチュートリアル (Win7 の場合)

>>:  LinuxでRPMを使用してmysql5.7.17をインストールする

推薦する

複数の値を返す MySQL ストアド プロシージャ メソッドの例

この記事では、例を使用して、MySQL ストアド プロシージャで複数の値を返す方法について説明します...

MySQL 学習チュートリアル クラスター化インデックス

クラスタリングは、実際には InnoDB データベース エンジンに関連しています。したがって、インデ...

type="file" の入力ボックスのスタイル変更の概要

入力タイプ「file」とは何ですか?これが何なのかは説明する必要はないと思います。誰もが知っているこ...

JavaScript関数の使い方の詳細な説明

目次1. 関数を宣言する2. 関数の呼び出し3. 関数パラメータ4. 関数の戻り値5. 議論の使用6...

MySQL テーブルをコピーする 3 つの方法 (要約)

テーブル構造とそのデータをコピーする次のステートメントは、データを新しいテーブルにコピーします。注:...

JavaScript Proxyオブジェクトの詳細な説明

目次1. プロキシとは何ですか? 2. 使い方は? 1. プロキシを使用する簡単な例2. 対象オブジ...

jQueryはテーブル行データのスクロール効果を実現します

この記事の例では、テーブル行データのスクロール効果を実現するためのjQueryの具体的なコードを参考...

CSS3 で高さと幅を不定にして垂直と水平に中央揃えするいくつかの方法

1. フレックスレイアウト 。父親 { ディスプレイ: フレックス; コンテンツの中央揃え: 中央;...

JS ベースのページフローティングボックスを実装するためのサンプルコード

スクロール バーを下に引くと、主にposition:fixed;スタイルにより、フローティング ボッ...

VMware 仮想マシン ubuntu18.04 インストール チュートリアル

インストール手順1. 仮想マシンを作成する 2. [カスタム(詳細)]を選択し、[次へ]をクリックし...

HTML+CSS+JavaScript でシンプルな三目並べゲームを作成する

目次HTMLの実装CSSを追加Javascript部分の実装デモアドレス HTMLの実装まず、hea...

Linux サーバーと Windows システム間でファイルをアップロードおよびダウンロードする方法

背景: Linux サーバーのファイルのアップロードとダウンロード。 XShell+Xftp インス...

HTML(divレイヤー)を介してFLASHにリンクを追加するための実装コード

今日、クライアントが広告を掲載したいのですが、提供された素材は Flash です。私たちはあまり気に...

MySql の 4 つのトランザクション分離レベルについて簡単に説明します。

分離レベル:隔離はあなたが考えるよりも複雑です。 SQL 標準では 4 つの分離レベルが定義されてお...

JS関数の呼び出し、適用、バインドの超詳細な方法

目次JS 関数呼び出し、適用、バインドメソッド1. call() メソッド1. call() メソッ...