JavaScript Diary

間違いだと思う [ 2001/07/28 ]

他サイトを見ていて思いましたが、よく下のようなコードを見ます。

function MyClass( id ){
    this.id = id ;
    ...
    this.alert = function(){ alert( this.id ); };
}

または

function MyClass( id ){
    this.id = id ;
    ...
    MyClass.prototype.alert = function(){ alert( this.id ); };
}

コンストラクタ関数内で(インスタンス)メンバを定義している例です。
これはやっちゃ駄目です。こんな風に書いてしまうとインスタンスを生成するたびに無駄な処理をしてしまいます。
例えば、このクラスのインスタンスを10個生成した場合、alert メソッドを10回定義することになります。こういうものは1回定義してやれば十分です。
prototype で各インスタンスに継承する場合、理由(インスタンスを一個しか生成しないとか)がない限りコンストラクタ関数外で定義するのが定石です(下)。

function MyClass( id ){
    this.id = id ;
    ...
}

MyClass.prototype.alert = function(){ alert( this.id ); };

また、以下のようなものもありました。

function MyClass( arg ){ ... }

MyClass.prototype.PI = 3.14 ;

static な意味のメンバを定義したいのでしょうが、こうするくらいなら下のように書いた方がましです。

function MyClass( arg ){ ... }

MyClass.PI = 3.14 ;