0

Prototype パターンを使用して、Web コントロール用のクライアント側 API を作成しようとしています。しかし、「これ」を管理しなくて済むようにして、生活を楽にしたい。

これはいくつかのサンプル コードです (問題のある行をコメントしました):

MyObject = function ()
{
    MyObject.initializeBase(this);

    this._someProperty = null;
};    

MyObject.prototype = {

    initialize: function()
    {
        // Init
    },

    get_someProperty: function()
    {
        return this._someProperty;
    },

    set_someProperty: function(value)
    {
        this._someProperty = value;
    },    

    doSomething: function ()
    {
        $('.some-class').each(function ()
        {
            $(this).click(this.doClick);  // this.doClick is wrong
        });
    },

    doClick: function ()
    {
        alert('Hello World');
    }
};

通常、公開モジュール パターンを使用して、プライベート変数を宣言します。

var that = this;

Prototype パターンで同様のことを行うことはできますか?

4

2 に答える 2

4

doSomethingメソッド内で行うだけで、これまでとまったく同じことができます。

doSomething: function ()
{
    var instance = this;
    $('.some-class').each(function ()
    {
        $(this).click(instance.doClick);
    });
},

このアプローチはprototype、ネストされた関数でコンテキストを管理する方法にすぎません。そのため、プロトタイプ (メソッド) の関数が in 内にネストされた関数を持っているthis場合、ネストされたスコープでアクセスする場合は、それらのレベルのいずれかでコンテキストを保持する必要がある場合があります。

于 2012-08-09T16:27:59.980 に答える
0

ES5Function.prototype.bind()が選択肢の 1 つになるかもしれません。あなたは次のように行くことができます

doSomething: function ()
{
    $('.some-class').each(function(_, node)
    {
        $(node).click(this.doClick);  // this.doClick is right
    }.bind(this));
},

ここで、呼び出しによって各イベント ハンドラーをプロキシ.bind()し、その結果、プロトタイプ オブジェクトのコンテキストでそれを呼び出します。ここでの注意点は、実際のDOM ノードthisを参照する必要がなくなったため、代わりに jQuery から渡された引数を使用する必要があることです。

于 2012-08-09T16:44:07.560 に答える