3

何よりもまず、私は新しく、この素晴らしいコミュニティに参加できてうれしいです。問題は、私は次のようなCharacterというJavaScriptクラスを持っているということです。

var Character = function()

{

    // ..Some previous Properties / Methods (included one called "StareDown()")..

    // And this method:

    this.GrabDown = function()

    {
        Context.clearRect(0, 0, CanvasWidth, CanvasHeight);
        //Context.fillRect(0, 0, CanvasWidth, CanvasHeight);
        Context.drawImage(this.GrabbingDown, CharacterX, CharacterY, SpriteWidth, SpriteHeight);

        window.setTimeout
        (
            function()

            {
                // Here is where I want to call the parent class method "StareDown()", but I don't know how.                
            },
            250
        );
    }
}

だからこれは私の大きな質問です、どうすればそのサブ匿名関数を介して親メソッドにアクセスできますか?私は一晩中それを理解しようとしていましたが、私はいくつかの有用な情報を見つけることができませんでした、ありがとう!

4

3 に答える 3

1

親のオブジェクトを変数に格納する必要がありthisます(関数を次のように定義したと仮定します)this.StareDown = function () {...}

var Character = function()

{

    // ..Some previous Properties / Methods (included one called "StareDown()")..
    this.StareDown = function() {...}

    var curCharacter = this;

    this.GrabDown = function()

    {
        Context.clearRect(0, 0, CanvasWidth, CanvasHeight);
        //Context.fillRect(0, 0, CanvasWidth, CanvasHeight);
        Context.drawImage(this.GrabbingDown, CharacterX, CharacterY, SpriteWidth, SpriteHeight);

        window.setTimeout
        (
            function()

            {
                // Here is where I want to call the parent class method "StareDown()", but I don't know how.       
                curCharacter.StareDown(...);         
            },
            250
        );
    }
}
于 2012-10-04T14:44:18.350 に答える
0

使用することもできますwindow.setTimeout(this.StareDown,250);が、メソッドはグローバルコンテキストで呼び出されることに注意してください(つまり、これは、メソッドを呼び出したインスタンスでwindowはなく、を指します。CharacterGrabDown

関数をオブジェクトメソッドとして使用するには:

window.setTimeout((function(that)
{
    return function()
    {
        return that.StareDown();
    }
})(this),250);

動作するはずです。これはかなり冗長であり、おそらくMDN docsを見るとcallapply特にbind役立つ可能性があります。

于 2012-10-04T14:48:59.790 に答える
0

これは私がしたであろうことです:

var Character = function () {
    this.GrabDown = function () {
        setTimeout(function () {
            // call this.StareDown in here
        }.bind(this), 250);
    };
};

これは、に渡されthisた匿名へのポインタをバインドしているために機能します。したがって、クラスの通常のメソッドのように使用できます。FunctionExpressionsetTimeout

于 2012-10-04T15:11:19.727 に答える