【问题标题】:Call parent method in a JavaScript Class在 JavaScript 类中调用父方法
【发布时间】:2012-09-25 15:21:50
【问题描述】:

我是新手,我很高兴加入这个伟大的社区。问题是,我有一个名为 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
        );
    }
}

所以这是我的大问题,如何通过该子匿名函数访问父方法?我整晚都在试图弄清楚,但我找不到一些有用的信息,谢谢!

【问题讨论】:

    标签: javascript methods call parent


    【解决方案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
            );
        }
    }
    

    【讨论】:

    • 太棒了,这是最简单的方法,只需将我的 this 分配给一个名为 Parent 的 var,然后按照您向我展示的那样通过它调用该方法,非常感谢。
    【解决方案2】:

    您可以只使用window.setTimeout(this.StareDown,250);,但请记住该方法将在全局上下文中调用(即,它将指向window,而不是调用Character 方法的Character 实例。

    要将函数用作对象方法:

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

    应该可以。这相当冗长,也许查看 callapply 尤其是 bind 的 MDN 文档可能会很有用

    【讨论】:

      【解决方案3】:

      这就是我会做的:

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

      之所以有效,是因为我们将this 指针绑定到传递给setTimeout 的匿名FunctionExpression。因此它可以像类的普通方法一样使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-27
        • 2020-12-27
        • 2016-02-14
        • 2012-08-04
        • 1970-01-01
        • 1970-01-01
        • 2019-05-18
        • 2011-01-03
        相关资源
        最近更新 更多