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などをいじらずにそれっぽい書き方ができるので、是非そちらのほうで。