【问题标题】:JavaScript Class Methods Not Being ExecutedJavaScript 类方法未执行
【发布时间】:2024-05-03 16:35:02
【问题描述】:

我在用 JavaScript 创建类时遇到了一些麻烦。我看过很多例子,但似乎无法使它们成为我理解的东西。 alerts() 永远不会出现在下面。

function Player(){

    function run(){

        alert('run');
        self.update();
        self.draw();

    }

    function draw(){
        alert('draw');
    }

    function update(){
        alert('update');
    }

}

var player1 = new Player();
player1.run(); 

【问题讨论】:

  • 检查你的 JavaScript 错误控制台,它会告诉你到底哪里出了问题。
  • 构造函数,不是类
  • 我没有在控制台中收到错误。我是否必须通过托管网站的服务器服务更改设置?

标签: javascript class methods


【解决方案1】:

使用 self.name = function(){} 添加函数

function Player(){
    var self = this;
    self.run = function(){

        alert('run');
        self.update();
        self.draw();

    }

    self.draw = function(){
        alert('draw');
    }

    self.update = function(){
        alert('update');
    }

}

var player1 = new Player();
player1.run();

【讨论】:

  • 我从来不知道我必须将self 声明为this,我以前从来没有这样做过。感谢您的回答。
  • 没问题!将this 的原始值存储在变量中很方便,以便内部函数可以引用它。这些内部函数有自己的this,所以如果this.update(); 在run 函数内部,它将无法工作。
【解决方案2】:

语法有点不对..

function Player(){

    this.run = function(){

        alert('run');
        self.update();
        self.draw();

    }

    ....
}

他们都这样..

【讨论】:

    【解决方案3】:

    正如其他答案所指出的,内部函数并未作为实际类的一部分公开(即它们不是 public 方法)。

    如下定义你的类的公共方法:

    function Player(){
    
        //PUBLIC!
        this.run = function(){
            //...
        }
    
        //NOT PUBLIC
        function update(){
            //...
        }
    }
    

    【讨论】:

      【解决方案4】:

      因为您看起来像是在进行游戏开发,所以您会想要采用一些更以 javascript 为中心的 OOP 范例。如果您正在创建一个类,请在原型上定义实例方法,而不是函数本身。

      为什么?因为当您调整游戏的性能时,每一毫秒或每一位内存都很重要(除非您正在制作井字游戏或其他微不足道的游戏)。但这是一个好习惯。

      function Player(){}
      
      Player.prototype.run = function(){ ... }
      Player.prototype.draw = function(){ ... }
      Player.prototype.update = function(){ ... }
      
      var player1 = new Player();
      player1.run(); 
      

      【讨论】:

        【解决方案5】:

        您可以利用以下模式之一实现此目的...

        function Player() {
            this.run = function() {
                /*...*/
            }
        }
        

        function Player() {
            function run() {
                /*...*/
            }
        
            return {
                run: run
            }
        }
        

        function Player() {
        }
        
        Player.prototype.run = function() {
            /*...*/
        };
        

        要深入了解这些模式,请查看这篇精彩的文章:3 ways to define a JavaScript class

        【讨论】: