akkun_choi pedia
mindia › akkun_choi pedia › 単語

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

akkun_choi · 2009-07-21 更新 · 2 ポイント · 履歴(8)
第 6 版(2009-03-16 18:20:48 · akkun_choi)を表示しています。 最新版に戻る

カプセル化

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

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

>|javascript|
// コンストラクタ
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

なんでprivateの中でthis使えないの?

>|javascript|
var A = function(){
var hoge = function(){
console.log(this, " in Private");
}
this.moge = function(){
console.log(this, " in Privileged");
hoge();
}
}
var obj = new A();
obj.moge();

return;
||<
実行すると

Object  in Privileged
Window test.html in Private

こうなりました。

あーそうか、関数呼ぶときは{object}.{method}にしないとだめなんだ。そうしないと暗黙的にグローバルオブジェクトwindowが使われるのか。いやまて、どっちにしろオブジェクト「A」はメソッド「hoge」を持ってるわけなくて、存在しているのはコンストラクタのスコープの中だけか。

スコープとコンテキスト混同してたわ。

ちなみに、こうすると使えるようになります。
>|javascript|

var A = function(){
var hoge = function(){
console.log(this, " in Private");
}
this.moge = function(){
console.log(this, " in Privileged");
hoge.call(this);
}
}
var obj = new A();
obj.moge();

return;
||<

Object in Privileged
Object in Private

履歴

タグ

他の人の「JavaScriptのオブジェクト指向プログラミング」