prototypeに直接オブジェクトを代入するときの不具合

javascriptの”クラス”の作り方としていくつかの方法があるが

function class1(){
}
class1.prototype={
 prop:1
}

こういう書き方がある。なんだか記述量が減って素敵な気がするのだが

function class2(){
}
class2.prototype.prop = 1;

実は、こういう作り方と微妙に違うのである。何が違うかというと、class1の方法の場合、本来受け継がれるべき暗黙のプロパティーが消されているのだ。

alert((new class1()).constructor);
alert((new class2()).constructor);

class1のconstructorはobject関数(組み込み)を返し、class2のconstructorはclass2関数を返す。

constructorは、そのオブジェクトが何のクラスに属しているか、を示す大切な値で

if (x.constructor == class1){
  class1の時の処理
}

のような使い方ができる。
instanceof 演算子でも似たことができるがinstanceofは継承元のクラスでもtrueを返してしまうしー。

constructor以外にもいろいろ引き継いでいるものがあるかもしれないので、なるべくclass2の方法で制作してほしいなぁ。

prototype.js を使うのであれば

function class1(){
}
Object.extend( class1.prototype, {
 prop:1
} );

というやり方で,constructorなどをいじらずにそれっぽい書き方ができるので、是非そちらのほうで。