ES2015のclassが使えない環境で、前回はクラスの定義方法について基本的な部分を記載しました。(コンストラクタ・パブリックメンバの定義方法など)
今回は、プライベートメンバを使用してクラスを定義します。
目次
プライベートメンバ
プライベートメンバとは、クラス内からのみアクセスできるメンバ(プロパティ・メソッド)のことです。
前回、this で定義したメンバは、パブリックメンバと言いクラス外からもアクセスすることができました。
Javaなどの言語をさわったことがある方は、クラスの変数はprivateで宣言し、変数への値の取得・設定は、getterやsetterなどのアクセサメソッドを使用した実装をよく見かけると思います。
JavaScriptでそのような実装を行うには、クロージャを使用します。
プライベートメンバの定義方法
定義したクラスのコンストラクタ内で、var を使用して定義したプロパティやメソッドは、プライベートメンバになります。
プロパティの定義例
1 |
var remainingFuel = 12; |
メソッドの定義例(残り燃料の有効値チェック)
1 2 3 4 5 6 |
var isRemainingFuel = function( num ){ if( typeof num === 'number' && num >= 0 ){ return true; } return false; } |
アクセサメソッドの定義方法
先ほど定義した残り燃料を表すプロパティ(remainingFuel)にクラス外から値を取得・設定したい場合は、アクセサメソッドを定義します。
クラス外からアクセスさせるので、this を使用して定義します。
また、命名規則として、取得は接頭辞として get 、設定は接頭辞として set をつけることが多いと思います。
アクセサメソッドの定義例(残り燃料)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// 残り燃料を取得 this.getRemainingFuel = function(){ return remainingFuel; } // 残り燃料を設定 this.setRemainingFuel = function( num ){ if( isRemainingFuel(num) === true ){ remainingFuel = num; } else { remainingFuel = 0; } } |
これで、インスタンス変数からアクセサメソッドを呼び出して、残り燃料を取得・設定することができるようになります。
今までのメンバの宣言を合わせると次のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
// Carクラスを定義 var CarClass = function( ) { // プライベートプロパティ var remainingFuel = 0; // 残り燃料 // プライベートメソッド(残り燃料のチェックメソッド) var isRemainingFuel = function( num ){ if( typeof num === 'number' && num >= 0 ){ return true; } return false; } // アクセサメソッド(残り燃料を取得) this.getRemainingFuel = function(){ return remainingFuel; } // アクセサメソッド(残り燃料を設定) this.setRemainingFuel = function( num ){ if( isRemainingFuel(num) === true ){ remainingFuel = num; } else { remainingFuel = 0; } } }; // Carクラスをインスタンス化 var car1 = new CarClass(); // 残り燃料を設定 car1.setRemainingFuel(15); // 残り燃料を取得 var curRemainingFuel = car1.getRemainingFuel(); // 残り燃料を表示 console.log('残り燃料:' + curRemainingFuel); // アクセサメソッドを経由しないで直接アクセスすると undefined になる console.log('残り燃料:' + car1.remainingFuel); |
以上がプライベートメンバの定義方法になります。
厳密に変数へのアクセスを管理したい場合に効果を発揮すると思います。