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
なんでprivateの中でthis使えないの?
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」を持ってるわけなくて、存在しているのはコンストラクタのスコープの中だけか。
スコープとコンテキスト混同してたわ。
ちなみに、こうすると使えるようになります。
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
privileged method はprivateにもpublicにもアクセスできるなら、publicいらなくない?
http://blogs.msdn.com/kristoffer/archive/2007/02/13/javascri...
prototypeで定義する方が速いです。
といっても差がでるのは万単位でnewする場合だけど。
privateやprivilegedにすると、newするたびに、関数の中が実行される。メソッドなども再定義される。
のでメモリを食う。生成に時間もかかる。