====== JavaScript プライベートメンバ ====== --- //[[http://www.y2sunlight.com/water|y2sunlight]] 2021-05-17// ===== プライベートメンバの定義 ===== JavaScriptでは他のオブジェクト指向言語と異なり、プライベートメンバを定義する構文がありません。その代わりに[[js:function:closure|クロージャ]]を使用します。 function Circle(radius) { var _radius; // プライベートメソッド(クロージャ) var _area = function() { return _radius * _radius * Math.PI; }; // パブリックメソッド this.setRadius = function(radius) { // プライベートプロパティに設定 _radius = radius }; // パブリックメソッド this.getRadius = function() { // プライベートプロパティから取得 return _radius; }; // パブリックメソッド this.getArea = function() { // プライベートメソッドにアクセス return _area(); }; this.setRadius(radius); } var a = new Circle(10); console.log(a.getRadius()); // 結果:10 console.log(a.getArea()); // 結果:314.1592653589793 \\ ==== 特権メソッド ==== 特権メソッドとは、クラスのプライベートメンバにアクセスできるメソッド(クロージャ)の事です。特権メソッド自体はクラス内のパブリックメンバや他のインスタンスからアクセス出来るので、内部のプライベートメンバと外部との橋渡し的存在となります。 \\ 特権メソッドはアクセッサ―と呼ばれることがあり、プライベートメンバを取得するゲッターメソッドと、設定するセッターメソッドに分かれます。上例では ''setRadius()'' や ''getRadius()'' がアクセッサーになります。 * getRadius() ・・・ ゲッターメソッド * setRadius() ・・・ セッターメソッド  \\ ===== Object.defineProperty ===== 上例の様に特権メソッド(クロージャ)を使用して、アクセッサを実装する代わりに、''Object.defineProperty'' メソッドを利用してアクセッサーメソッドを実装することもできます。 function Circle(radius) { var _radius; // プライベートメソッド(クロージャ) var _area = function() { return _radius * _radius * Math.PI; }; Object.defineProperty( this, 'radius', { get: function(){ return _radius; }, set: function(radius){ _radius = radius; } } ); Object.defineProperty( this, 'area', { get: function(){ return _area(); } } ); this.radius = radius; } var a = new Circle(10); console.log(a.radius); // 結果:10 console.log(a.area); // 結果:314.1592653589793 詳しくは[[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty|こちら]]を参照してください。 \\