JavaScriptのオブジェクト指向プログラミングの履歴

カプセル化

privateなメンバー、メソッドでthisできないの知らなくてちょっとはまった…。call, applyで呼べるっちゃ呼べるけどどうなだろ…。

privateメソッドっていうよりクロージャって呼だ方がよくね?

// コンストラクタ
var Human = function(name, called){
  
  // private member
  // - このスコープでのみアクセス可能
  var happy = false;
  
  // public member
  // - いつでもアクセス可能
  this.name = name;
  
  // private method
  // - 単なるクロージャ
  // - 普通に呼び出すとグローバルコンテキストで実行される。
  //   callしない限りこのオブジェクトでのthisが使えない
  // - private memberのみアクセスできる
  var format = function(){
    return name + ', "' + called + '"';
  }
  
  // privileged method
  // - privateにもpublicにもアクセスできる
  this.makeHappy = function(){
    happy = true;
  };
  this.isHappy = function(){
    return happy;
  }
  this.toString = function(){
    return format();
  }
};

// public method
// - privilegedにアクセスできる
// - privileged が定義されていればそちらが優先させる
Human.prototype.faith = function(num){
  this.makeHappy();
};

var akkun = new Human('akkun', 'the sleeping drummer');
console.log(akkun.name);      
console.log(akkun.toString()); 
console.log(akkun.isHappy());
akkun.faith();
console.log(akkun.isHappy());
console.log(akkun.format);
  
//  akkun
//  akkun, "the sleeping drummer"
//  false
//  true
//  undefined