2

これが答えられたら申し訳ありませんが、私はそれを検索することができませんでした...検索するのは難しいことだと思います!

私がこれを持っていると言う:

var MyPrototype = function() { this.init(); }
$.extend(MyPrototype.prototype, {
    a: 5,
    init: function() {
        var thing = new SomeOtherClass();
        thing.meth = this.meth;
        // thing.meth() is called somewhere within thing;
    },
    meth: function() {
        alert(this.a);
    }
}

基本的に、私はコールバックとして独自のメソッドを使用する別のクラスを扱っています。たとえば、独自の機能でそれらをオーバーライドすることが期待されています。しかし、それを実行している間、適切なスコープを保持する必要がありますthis(私が気にSomeOtherClassするのは、コールバックに渡されるものだけです。状態には何もありません)。

ご想像のとおり、プロパティthingがないため、これは機能しません。aただし、Javascriptスコープの複雑さに精通していないため、必要thisなものを参照する方法を知ることができません。

4

5 に答える 5

2

ここで他の2つの答えを組み合わせて、meth関数を書き直す必要がないように、次のようにします。

    var me = this;
    thing.meth = function() {
        MyPrototype.meth.apply(me, arguments);
    };
于 2009-07-27T22:04:52.403 に答える
1

あなたはそれがどのように呼ばれるかを制御することができないので、あなたはこれを試すことができます:

var MyPrototype = function() { this.init(); }
$.extend(MyPrototype.prototype, {
    a: 5,
    init: function() {
        var thing = new SomeOtherClass();

        // Create an aliad for this
        var that = this;
        thing.meth = function() {
            // You can always access the object using it's "that" alias
            alert(that.a);
        };
    }
}

または...

var MyPrototype = function() { this.init(); }
$.extend(MyPrototype.prototype, {
    a: 5,
    init: function() {
        var thing = new SomeOtherClass();

        // Create an aliad for this
        var that = this;
        thing.meth = function() {
            // You can always access the object using it's "that" alias
            that.meth();
        };
    },
    meth: {
        alert(this.a);
    }
}
于 2009-07-27T21:57:04.573 に答える
0

コードサンプルを開始する前に、次の行を追加します。

var self = this;

次に、コード内の「this」のすべての使用を「self」に置き換えます。

(これに対する答えの多くは、多かれ少なかれ同じことを言っていると思います。)

于 2009-07-27T22:06:42.790 に答える
-1

このようなことをしてもらえますか?

var MyPrototype = function() { this.init(); }
$.extend(MyPrototype.prototype, {
    a: 5,
    init: function() {
        var thing = new SomeOtherClass();
        var self = this;
        thing.meth = function(){this.meth.apply(self)};
        // thing.meth() is called somewhere within thing;
    },
    meth: function() {
        alert(this.a);
    }
}
于 2009-07-27T21:56:09.223 に答える
-1

どうですか:

thing.meth.call(this);

また

thing.meth.apply(this);

(唯一の違いは、引数の受け渡し方法にあります。この場合は関係ありません。)

于 2009-07-27T21:38:31.177 に答える