— 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() がアクセッサーになります。
上例の様に特権メソッド(クロージャ)を使用して、アクセッサを実装する代わりに、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
詳しくはこちらを参照してください。