2008年8月25日月曜日

JavaScript の new 演算子についてのメモ

先日会社の勉強会で教わったのだけど、忘れそうなのでメモ。
勘違いして覚えてるかも・・・


function dummyObject(x,y){
this.x = x;
this.y = y;
}

var newObject = new dummyObject(2,5);


new で 空のオブジェクト作成

参照先として、自分自身のプロトタイプ (dummyObject.prototype) を設定

作成した空のオブジェクトを this として、引数はそのままで、関数の中身を実行。

左辺の変数に作成した空の(既に空じゃないけど)のオブジェクトへの参照を渡す。

この際の this.x , this.y は外部からは以下で参照できる。

newObject.x // 2
newObject.y // 5

以下のようにした場合はどうなるか?

var newObject = dummyObject(2,5)

newObject.x //undefined
newObject.y //undefined

this には window オブジェクトが入るため、参照できない。
参照する場合は、以下のような感じ。

window.x // 2
window.y // 5

=-=-=-=-=-=-=-=-=-=-=-=-=-=

ここからはブラウジングしてて以下の内容を見つけたので、参考(ほとんどそのままだけど・・・)にさせてもらいました。

【jQuery】Simple Class  Instantiation


以下のように定義すればいろいろ回避?
new した際は必ず this instanceof arguments.callee が true になるのか気になる。


function dummyObject(x,y){
if(this instanceof arguments.callee){
this.x = x;
this.y = y;
} else {
return new arguments.callee(x,y);
}
}




可変長引数の場合どうしたらいいんだろ・・・

function dummyObject(){
if(this instanceof arguments.callee){
this.init.apply(this,arguments);
} else {
return new arguments.callee(ここの引数が分からない);
}
}


return new arguments.callee(arguments); とすると applyの際に [arguments] が渡るし・・・

と思ってもう一回よく読んだら答えが書いてあった・・・
第一引数が callee プロパティを持っていたら内部で new したこと確定か。。。
今日一日悩んでて気づかなかった。orz

function dummyObject(args){
if(this instanceof arguments.callee){
this.init.apply( this, args.callee ? args : arguments );
} else {
return new arguments.callee(arguments);
}
}