Chrome 21 でコンストラクター関数のプロトタイプを定義するのに問題があります。疑似クラスベースの構造 (したがって「サブクラス」プロパティ) を実装しようとしている大きなプロジェクトに取り組んでいます。データのカプセル化ですが、私は JavaScript でのプロトタイピングと継承に比較的慣れていないため、何が問題なのかわかりません。StackOverflow には他にも漠然と似たスレッドがありますが、この問題を解決するものはありません。
私が使用しているコンストラクタは次のとおりです。
function Root()
{
this._subclass = "Root";
this.subclass = function(){
return this._subclass;
};
this._date;
this.date = function(){
return this._date;
};
}
function CustomDateTime()
{
this._subclass = "CustomDateTime";
this._value = new Date();
}
CustomDateTime.prototype = new Root;
function CurrentDate()
{
this._subclass = "CurrentDate";
}
CurrentDate.prototype = new CustomDateTime;
直感的に、これを行うことができるはずだと私には思えます (Root
コンストラクターで subclass() が定義されているため):
var now = new CurrentDate();
alert(now.subclass()); // should alert "CurrentDate"
しかし、スクリプトを実行すると、TypeError: Object #<CurrentDate> has no method 'subclass'
. さらに、CurrentDate
このアラートを含めるようにコンストラクターを変更すると、次のようになります。
function CurrentDate()
{
alert(this._subclass);
this._subclass = "CurrentDate";
}
CurrentDate.prototype = new CustomDateTime;
結果のメッセージはundefined
です。
代わりに を割り当てるvar now = new CustomDateTime()
と、subclass() メソッドを呼び出すと、意図したとおりに「CustomDateTime」が返されます。別のコンストラクター も定義しました。このコンストラクターModelObject
のプロトタイプは に設定されRoot
、subclass() はこれらのオブジェクトに対しても意図したとおりに機能します。
私がこれから得ているのは、CurrentDate コンストラクターが CurrentDate : CustomDateTime : ルート チェーンから除外されており、単にスタンドアロン コンストラクターとして呼び出されているということです。この関数を使用して作成されたオブジェクトは、割り当てられたプロトタイプから継承されているようには見えません。 CurrentDate 関数オブジェクトに。
これは JavaScript プロトタイプを使用する正しい方法ではありませんか? 繰り返しますが、これは非常にスムーズに進むはずです..