2

このコードを実行すると、コンストラクターで最初に渡された値はすべてTest(callbacks)、後のインスタンス化でも常に呼び出されるコールバックになります。Test

function Test(callbacks) {
    if (callbacks) {
        if (callbacks.callback) {
            this.callback = callbacks.callback;
        }
    }

    this.options.complete = $.proxy(this.options.complete, this);
}

Test.prototype = {
    options: {
        type: "GET",
        complete: function() {
            this.callback();
        }
    },
    callback: function() { console.log("OVERRIDE ME"); },

    execute: function() {
        $.ajax(this.options);
    }
};

var eins = {callback: function() {console.log("AAA");}};
var zwei = {callback: function() {console.log("BBB");}};

var A = new Test(eins);
var B = new Test(zwei);

A.execute();
B.execute();

このコードを実行すると、出力が得られるたびにAAAfunction() {console.log("AAA");}プロトタイプの定数値になるにはどうすればよいですか?

4

2 に答える 2

1

すべては次の行から始まります。

this.callback = callbacks.callback;

を呼び出すとnew Test(eins)、引数einsとして が入ります。callbacks次に、その行はthis.callback(つまり、Test の新しいインスタンスの "callback" プロパティ) を のコールバック プロパティに設定しますcallbacks。のeins

それだけでは B には影響しません。ただし、注意が必要な点があります。

this.options.complete = $.proxy(this.options.complete, this);

Test インスタンスの "options" プロパティが設定されると思いますよね? 違う。Javascript が機能する方法は、インスタンスでプロパティが定義されていない場合 (たとえば、定義していない場合this.options = something)、Javascript は「プロトタイプ チェーン」を検索し、そこでプロトタイプの「オプション」を見つけて設定します (インスタンスには「オプション」がないため、インスタンスの「オプション」ではありません)。

その行を次のように変更することで、これらすべてを修正できます。

this.options = {complete: $.proxy(this.options.complete, this)};

もちろん、それはあなたを失うtype: "GET",ので、あなたがする必要がある:

this.options = {type: "GET", complete: $.proxy(this.options.complete, this)};

または、プロトタイプのオプションをベースにする必要があります。

this.options = {};
for (var key in this.prototype.options) {
    this.options[key] = this.prototype.options[key];
}
this.options.complete = $.proxy(this.options.complete, this);

(優れた) Underscore ライブラリを使用している場合は、extendこの種のことをより簡単に行うための関数さえあります。

this.options = _.extend({}, this.prototype.options,
                        {complete: $.proxy(this.options.complete, this)});

または (スタイルの好みに応じて):

this.options = _.extend({}, this.prototype.options);
this.options.complete = $.proxy(this.options.complete, this);

ちなみに、Underscore には_.bindjQuery の「proxy」に匹敵するメソッドもあるので、次のようにすることもできます。

this.options = _.extend({}, this.prototype.options);
this.options.complete = _.bind(this.options.complete, this);
于 2012-12-13T20:27:49.703 に答える
0

あなたがするとき

    this.options.complete = $.proxy(this.options.complete, this);

options.completeプロトタイプの機能を、常にコンテキストを持つものに置き換えてthisいます。

問題は、 にthis.options固有のオブジェクトthisがなく、同じプロトタイプを持つすべてのオブジェクトと共有されるオブジェクトが 1 つしかないことです。

于 2012-12-13T20:27:39.980 に答える