Water Sunlight

軽量プログラミングの文法 - JavaScript/Python

ユーザ用ツール

サイト用ツール


js:object:private

JavaScript プライベートメンバ

y2sunlight 2021-05-17

プライベートメンバの定義

JavaScriptでは他のオブジェクト指向言語と異なり、プライベートメンバを定義する構文がありません。その代わりにクロージャを使用します。

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

詳しくはこちらを参照してください。


js/object/private.txt · 最終更新: 2021/05/31 12:36 by tanaka