0

次のコードjsFiddleを使用して、フォーム フィールドとイベントを操作しています。これに関して以前に 2 つの質問をしましたが、非常に役に立ちました。今、新しい問題/質問があります。

function Field(args) {
    this.id = args.id;

    this.elem = document.getElementById(this.id);
    this.value = this.elem.value;
}

Field.prototype.addEvent = function (type) {
    this.elem.addEventListener(type, this, false);
};

// FormTitle is the specific field like a text field. There could be many of them.
function FormTitle(args) {
    Field.call(this, args);
}

Field.prototype.blur = function (value) {
    alert("Field blur");  
};

FormTitle.prototype.blur = function () {
    alert("FormTitle Blur");
};

Field.prototype.handleEvent = function(event) {
    var prop = event.type;
    if ((prop in this) && typeof this[prop] == "function")
        this[prop](this.value);
};

inheritPrototype(FormTitle, Field);
var title = new FormTitle({name: "sa", id: "title"});
title.addEvent('blur');


function inheritPrototype(e, t) {
    var n = Object.create(t.prototype);
    n.constructor = e;
    e.prototype = n
}

if (!Object.create) {
    Object.create = function (e) {
        function t() {}
        if (arguments.length > 1) {
            throw new Error("Object.create implementation only accepts the first parameter.")
        }
        t.prototype = e;
        return new t
   }
}

問題は、親メソッド (Field.prototype.blur) をオーバーライドし、代わりにタイトル オブジェクトに FormTitle.prototype.blur メソッドを使用することです。ただし、オブジェクトは親メソッドを参照し続け、アラートには常に「FormTitle Blur」ではなく「Field blur」が表示されます。どうすればこれを機能させることができますか?

4

1 に答える 1

1

プロトタイプでメソッドを定義してから、FormTitleを使用してプロトタイプ全体を別のオブジェクトに置き換えますinheritPrototype

順序を入れ替える必要があります。最初にこれを呼び出します:

inheritPrototype(FormTitle, Field);

次に、作成したばかりのプロトタイプ オブジェクトに onblur を設定します。

FormTitle.prototype.blur = function () {
    alert("FormTitle Blur");
};

http://jsfiddle.net/zMF5e/2/

于 2013-05-17T22:41:00.400 に答える