コンストラクタ関数では、thisを使ってpublicな変数と、let,constを使ってprivateな変数を宣言することができます。
- publicな変数はコンストラクタ関数をインスタンス化した後に、インスタンス化したオブジェクトからアクセス可能
- privateな変数はコンストラクタ関数内の処理のみで参照可能
という違いがあります。
今回は、definePropertyを使って、privateな変数をインスタンス化した後のオブジェクトから参照する方法をご紹介します。
コンストラクタ関数におけるprivateな変数とpublicな変数の違い
1 2 3 4 5 6 7 8 |
function ConstructorFunction() { let a = "aaa"; this.b = "bbb"; } const instance = new ConstructorFunction(); console.log(instance.a); // undefined console.log(instance.b); // bbb |
このように、javascriptでは、コンストラクタ関数内で、let,constで変数を宣言するか、this…で関数のpropertyとして変数を宣言するかで、privateな変数かpublicな変数かを区別します。
上記のコンストラクタ関数の場合、インスタンス化した後に、a(private)にはアクセスできませんが、b(public)にはアクセスが可能です。
definePropertyを使って、privateな変数にアクセス可能にする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
function ConstructorFunction() { let a = "aaa"; Object.defineProperty(this, "aboutA", { get: function() { return a; }, set: function(val) { a = val; } }); } const instance = new ConstructorFunction(); console.log(instance.aboutA); // aaa instance.aboutA = "bbb"; console.log(instance.aboutA); // bbb |
definePropertyメソッドを使えば、コンストラクタ関数に対して、新しいpropertyを追加することが可能です。
そのため、そのpropertyの中で、privateな変数に対するget,setの動作を行うようにすれば、安全にprivate変数に対する処理を記述していくことができます。
また、getとsetは関数なので、
- getするときに末尾に【円】をつけて、円表記で文字列を返す
- setするときに、ドルに変換(計算)して登録する
など、処理を挟んでprivate変数にアクセスすることが出来ます。