0

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 プロトタイプを使用する正しい方法ではありませんか? 繰り返しますが、これは非常にスムーズに進むはずです..

4

1 に答える 1

0

「灰色の状態が来る」という応答に感謝します。コードが jsfiddle で適切に実行されるのを見て、.html ページに複数のタグを含める場合は、プロトタイプの継承順にタグを配置する必要があることを学びました。CurrentDate.prototypeCurrentDate が CustomDateTime の前にある場合、 CustomDateTime 関数は割り当て時にまだ定義されていません。

于 2012-09-09T05:45:00.740 に答える