Javascriptでオブジェクト指向を実装してみるに当たって,thisとvarの違いを試してみた.

C++っぽく考えてみると,varはprotected変数で,thisは,動的に付け加えられるpublic変数といったところか.
このときおかしいなぁ・・・.と思えるのは,同じ変数名をvarとthisでそれぞれ利用できることだ.
this変数は,外部から変更およびアクセスが可能だが,varは,アクセス用のメソッドを用意することになる.
そう考えると,なんでわざわざvarを使う必要があるんだ・・・?ということになるがこれ以外に,私の試したところでは,コールバック的?なシーンでvarが使えるのだ.

<div id="canvas20070718-2" style="width:100px;height:100px;border-style:solid;border-width:thin;">
ここをクリックすると動作します.
</div>
<script src="./prototype.js"></script>
<script>
function hoge(){
var val1 = "val1";
this.val2 = "val2";
this.func = function () {
alert( 'varで宣言した変数->' + val1 );
alert( 'thisで宣言した変数->' + this.val2 );
}
}
$('canvas20070718-2').onmousedown = function() {
var obj = new hoge();
obj.func();
obj.val1 = "val1 modified";
obj.val2 = "val2 modified";
obj.func();
alert( '後から追加したことになった変数this.val1->' + obj.val1 );
var obj2 = new hoge();
obj2.func();
alert( '後から追加したことになった変数this.val1->' + obj2.val1 );
}
</script>

以上のコードは,val1がvarの変数,val2がthisの変数ということになる.
objでは,thisではないval1にアクセスし,値を代入しようとしているように見えるが,これはobjにthis.val1を追加していることになる.(ということであってると思うのだが)
obj2には,thisを使いしていないので,undefinedになるというわけだ.(ということであってると思うのだが)

ここをクリックすると動作します.