JavaScriptでprivate メンバー

JavaScriptでprivateメンバーを作るにはコンストラクタでの局所変数にする。

function Foo() {
  var name = "taro";
  this.setName = function(newName) {
    name = newName;
  };
  this.getName = function() {
    return name;
  };
}

var f = new Foo();

alert(f.name);
        
alert(f.getName());
f.setName("jiro");
alert(f.getName());

変更もきちんと反映される。ただし、Fooインスタンスを共有してしまっているため先のprototypeにインスタンスをそのまま置く継承はできない(1インスタンスの変更メソッド呼び出しがすべてのインスタンスに反映される)。

正しくするには以下のようにコンストラクタ内でコピーする:

function Bar {
  var traits = new Foo();
  for (var key in traits) {
    this[key] = traits[key];
  }
  this.getName = function () {
    return "[" + traits.getName() + "]";
  }
}