S-JIS[2004-01-10/2006-07-02] 変更履歴
JavaScriptでクラス(のようなもの)を定義・使用することが出来る。
Javaではクラスを定義して その中に変数とメソッドを記述していくが、JavaScriptではメソッドとなる関数を普通の関数と同じように定義し、コンストラクタとなる関数を作って その中で変数と関数を自分自身に代入する形をとる。文章だけだと分かりづら〜(爆)
クラス(のようなもの)をJavaとJavaScriptで対比させると、以下のような感じになる。
Java | JavaScript | ||
---|---|---|---|
クラス定義 |
class Test{
|
不要 | |
変数定義 |
public int value;
|
不要 | |
コンストラクタ |
public Test(int val){ this.value = val; } |
function Test(val){ this.value = val; this.func = func1; } |
関数も変数と同じ感じで初期化する。関数名は同じでもよい。 |
メソッド |
public void func(){ confirm(this.value); } |
function func1(){
confirm(this.value);
}
|
|
} |
|||
インスタンス化 |
Test test = new Test(1); |
test = new Test(1); |
|
メソッド呼び出し |
test.func();
|
test.func();
|
コンストラクタもどきで関数を初期化しているが、JavaScriptにおける関数定義とは、関数オブジェクト(Functionクラス)を作ることに他ならない。
「this.func=func1;
」という文は、ただFunctionインスタンス(func1)をセットしてるだけ
ということになるようだ。
したがって、直接関数を作るようにすれば、よりクラス定義らしく見える(かもしれない)。
Java | JavaScript | (別の書き方) | |
---|---|---|---|
クラス定義 |
class Test{
|
function Test(val){
|
|
変数定義 |
public int value;
|
不要 | |
コンストラクタ |
public Test(int val){ this.value = val; } |
||
this.value = val; |
|||
メソッド |
public void func(){ confirm(this.value); } |
this.func = new Function( "confirm(this.value);" ); |
this.func = function(){ confirm(this.value); } |
} |
} |
||
インスタンス化 |
Test test = new Test(1); |
test = new Test(1); |
|
メソッド呼び出し |
test.func();
|
test.func();
|
同じクラス(もどき)のインスタンスを複数作る場合、メソッドの定義(代入)をいちいちやるのは無駄が多いので、まとめて定義するprototypeというやり方がある。[2006-07-02]
Java | JavaScript | (別の書き方) | |
---|---|---|---|
クラス定義 |
class Test{
|
不要 | |
変数定義 |
public int value;
|
不要 | |
コンストラクタ |
public Test(int val){ this.value = val; } |
||
function Test(val){ this.value = val; } |
|||
メソッド |
public void func(){ confirm(this.value); } |
function func1(){
confirm(this.value);
}
Test.prototype.func = func1;
|
Test.prototype.func = function(){ confirm(this.value); } |
} |
|||
インスタンス化 |
Test test = new Test(1); |
test = new Test(1); |
|
メソッド呼び出し |
test.func();
|
test.func();
|
staticなメンバー(フィールド・メソッド)しかなくて、インスタンスを1つしか作らない(シングルトン)なら、以下のような書き方も出来なくはない。[2006-07-02]
Java | JavaScript | |
---|---|---|
クラス定義 |
class Test{
|
Test = {
|
変数定義 |
public static int value = 1;
|
value : 1, |
メソッド |
public void func(){ confirm(this.value); } |
func : function(){ confirm(this.value); } |
} |
} |
|
メソッド呼び出し |
Test.func();
|
Test.func();
|
これは、連想配列(マップ)のキーと値を初期化する方法を応用したもの。
残念ながらオブジェクト変数の代入は参照のコピーであって値のコピーではないので、このクラス(もどき)を複製して 同じクラスの別インスタンスを作ることは出来ない。