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をインストールする

推薦する

Vue-router ネストルーティングの詳細な説明

目次ステップ1. ルーティング ルールを設定し、子構成項目を使用します。 2. ジャンプ(フルパスを...

今日、私は非常に奇妙なクリックの問題に遭遇し、自分で解決しました

...こんな感じで、今日はポップアップウィンドウを作ろうと思ったのですが、バックエンド PHP によ...

Dockerを使用してgitlabコミュニティの中国語版を構築する詳細なプロセスを教えます

1. Docker Composeを使用して起動を構成するDocker Compose を知らない場...

ftp は SSH 経由で Linux にリモート接続します

まず Linux に ssh をインストールします。例として Centos を使用します。ポータル:...

Dockerコンテナの原理の分析

目次01 コンテナの本質とは何か? 02 Cgroupテクノロジーと名前空間テクノロジーの概要03 ...

Docker の詳細なイラスト

1. Dockerの紹介1.1 仮想化1.1.1 仮想化とは何ですか?コンピュータにおける仮想化とは...

メンテナンスしやすい CSS コードを書くための 5 つのガイドライン

1. スタイルシートの先頭にコメント ブロックを追加して、スタイルシートの作成日、作成者、タグ、その...

Vueコンポーネント通信方法事例まとめ

目次1. 親コンポーネントが子コンポーネントに値を渡す(props) 2. サブコンポーネントは親コ...

WeChatアプレットが検索ボックス機能を実装

この記事の例では、WeChatアプレットの検索ボックス機能を実装するための具体的なコードを参考までに...

Ubuntu 18.04 は pyenv、pyenv-virtualenv、virtualenv、Numpy、SciPy、Pillow、Matplotlib をインストールします

1. 現在、Pythonのバージョン管理ツールは数多く存在します。その中でも比較的使いやすいのがPy...

MySQL の問題を解決する: MSVCR120.dll が見つからないため、コードの実行を続行できません

1. 問題MySQL の初期化時に発生する問題は、次のとおりです。 1. 「MSVCR120.dll...

Vueカスタムテーブル列実装プロセス記録

目次序文レンダリングsetTable コンポーネント使用結論序文フォームを使用して PC 側のプロジ...

MySQL 同時実行制御の原則に関する知識ポイント

Mysql は、高性能なデータ ストレージ サービスを提供する主流のオープン ソース リレーショナル...

MySQL サービスに iptables ファイアウォール ポリシーを追加するためのソリューション

MySQL データベースが Centos7 システムにインストールされており、オペレーティング シス...

nginx が複数のプロキシ層を通過して実際の送信元 IP を取得するプロセスの詳細な説明

質問Nginx は $remote_addr を実際の IP アドレスとして受け取りますが、実際には...