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();

[2005-03-24/2006-07-02]

コンストラクタもどきで関数を初期化しているが、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();

これは、連想配列(マップ)のキーと値を初期化する方法を応用したもの。

残念ながらオブジェクト変数の代入は参照のコピーであって値のコピーではないので、このクラス(もどき)を複製して 同じクラスの別インスタンスを作ることは出来ない。


JavaScriptへ戻る / 技術メモへ戻る
メールの送信先:ひしだま