JavaScriptは、オブジェクト指向言語だという言葉を目にする.自分自身は,データと名前付リストのデータ構造をで処理をするスクリプトというイメージなので,正直,オブジェクト指向と言われると悩んでしまうが,自分の持っているオブジェクト指向とのずれがあるだけかもしれない.一部では、クラス型オブジェクトとプロトタイプ型オブジェクトとかいう文言もみるが、無理にオブジェクト指向と言わなくてもと思わないでもない.
というのも,オブジェクト指向何て言葉をきいたものだから,それを真に受けてプログラムをしてはまっているためかもしれない.
JavaScript のプログラムを作成していて、変数のスコープが今一つ分かっていない.変数のスコープが曖昧なのか、仕様をキチンと読んでいない段階で考えるのが間違っていると思うが、とりあえずメモとして残しておく。
とりあえず困ったのは,あるオブジェクトを用意して prototype で変数と関数を用意.クラス内の関数から,メンバ変数 hoge へアクセスするのに this.hoge としなくてはいけないということ.関数へのアクセスもそうだったのだから,気が付いても良さそうなのだが,先入観は恐い.
下のソースは,スコープの範囲を調べてみるために作ったもの.いろいろ書いてた途中なので整理されおらず,ゴミが残っているが気にしないでおく.
var Test1 = function() {
var a;
this.init();
};
Test1.prototype = {
b: 0,
c: 0,
init: function() {
this.a = 1, this.b = 2, c = 3;
}
};
var Test2 = function() {
var d;
this.init();
};
Test2.prototype = {
b: 0,
c: 0,
init: function() {
this.b = 4,this.c = 5,this.d = 6;
}
};
function starttest(){
var t1 = new Test1();
var t2 = new Test2();
console.log(t1.c); // 結果 0
console.log(t2.c); // 結果 5
console.log(c); // 結果 3
};
これから分かることは,JavaScript では,ローカル(?)の関数の中で変数を不用意に宣言すると大域変数として宣言してしまうみたい.といっても別のスクリプトを読み込んだ場合に、そこまで影響するのかは調べてはいないが,もしそうだとするならば,結構面倒なことにならないだろうか? Java などのクラスっぽく使うとどうしてもこういう形の記述となってしまいがちだと思うが.....
ただ,これに関してなにかが間違っているような気もするが,それは気が付いた時にでも修正するということで.