0

プロトタイプの継承に問題があり、正しく機能しない理由がわかりません。

スニペットは次のとおりです。

function Field(newKey, val) {
    this.key = newKey || "";
    this.value = val || "";
}

Field.prototype.isEmpty = function() {
    return this.value === undefined || this.value === null || this.value === "";
};

function DoubleField(newKey, val) {
    this.base = Field;
    this.base(newKey, val);
}
DoubleField.prototype = new Field();
DoubleField.prototype.constructor = DoubleField;

function IntegerField(newKey, val) {
    this.base = DoubleField;
    this.base(newKey, val);
}
IntegerField.prototype = new DoubleField();
IntegerField.prototype.constructor = IntegerField;

var f = new Field('keyfield', 'valField');
var d = new DoubleField('keydouble', 'valDouble');
var i = new IntegerField('keyinteger');

var res = f.isEmtpy();

f.isEmptyの呼び出しは失敗していますか?なんで?d.isEmptyまたはi.isEmptyの呼び出しは、期待どおりに正常に機能します。

自分が間違っていることに気づきません。どんな助けでも大歓迎です!

4

2 に答える 2

4

エラーはコードの最後の行にあります:

var res = f.isEmtpy();//That's what you wrote

正解は次のとおりです。

var res = f.isEmpty();
于 2012-05-11T21:40:11.177 に答える
1

あなたはそれがどのように失敗しているのかを言っていません。コメントで述べたように、少なくともタイプミスvar res = f.isEmtpy();があります。var res = f.isEmpty();

しかし、それを超えて(私は、コードではなく、質問のタイプミスであると思います)、派生コンストラクターのこの行に注意してください。

this.base = DoubleField;

...意図したとおりに機能しません。の場合を考えてみましょうIntegerField。あなたが電話するnew IntegerFieldと、それはに設定this.baseされDoubleField、それを呼び出します。ただし、DoubleFieldコンストラクターはに設定this.baseFieldます。したがって、ではなく、を指すプロパティを持つIntegerFieldインスタンスがあります。baseFieldDoubleField

インスタンスプロパティを使用して系統をトレースすることはできません。親/子の状況では機能しますが、上記の「孫」の問題が発生します。

継承ヘルパースクリプトの1つを使用することをお勧めします。私自身を含むいくつかがありますLineage。これらのスクリプトは、継承階層を構築するのに役立ち、配管を処理して、構築しようとしているものを何でも構築することに集中できるようにします。一時的に必要なだけです。JavaScriptは、次のバージョンでこれを支援するためのシンタックスシュガーを取得しています(ただし、実際に完成してから、JavaScriptが広くサポートされるようになるまでには数年かかるでしょう)。

于 2012-05-11T21:43:44.363 に答える