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

カプセル化の仕方

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

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