【问题标题】:Objects & Methods in JavaScriptJavaScript 中的对象和方法
【发布时间】:2014-11-04 11:14:37
【问题描述】:

在 JavaScript 中创建类之类的东西并创建它的多个实例的最佳方法是什么?

我尝试了以下方法:

function Test() {
    var currentState = -1;
    var stateArray = new Array();
}

Test.prototype.SetState = function(state) {
    this.currentState = state;

    stateArray.push(state);

    if (stateArray.length > 2) {
        stateArray.splice(0, 1);
    }
}

Test.prototype.GetState = function() {
    return this.currentState;
}

var Object1 = new Test();
var Object2 = new Test();

var EState = {
    ONE: 1,
    TWO: 2,
};

Object1.SetState(EState.ONE); //<< fails here

如果我使用它来创建一个对象,它会起作用,但是当我创建多个对象并使用它们中的任何一个时,都会出现以下错误:

Uncaught TypeError: undefined is not a function 

什么会导致这种行为?

【问题讨论】:

    标签: javascript class object


    【解决方案1】:

    问题是 stateArray 和 currentState 是私有的(仅对 Test() 是本地的)所以当您尝试在这种情况下执行 stateArray.push 时,stateArray 是未定义的,因此没有名为 push 的函数。解决此问题的一种方法是使用 this 关键字使它们成为 Test 的属性

    function Test() {
      this.currentState = -1;
      this.stateArray = new Array();
    }
    
    Test.prototype.SetState = function(state) {
      this.currentState = state;
    
      this.stateArray.push(state);
    
      if (this.stateArray.length > 2) {
        this.stateArray.splice(0, 1);
      }
    }
    Test.prototype.GetState = function() {
      return this.currentState;
    }
    
    var Object1 = new Test();
    var Object2 = new Test();
    
    var EState = {
      ONE: 1,
      TWO: 2,
    };
    
    Object1.SetState(EState.ONE);
    console.log(Object1);

    如果您希望这些是私有的,您只能从构造函数返回公开可用的函数并隐藏私有数据

    function Test() {
    
      //private
      var currentState = -1;
      var stateArray = new Array();
      //public
      return {
        SetState: function(state) {
          currentState = state;
          stateArray.push(state);
          if (stateArray.length > 2) {
            stateArray.splice(0, 1);
          }
        },
        GetState: function() {
          return currentState;
        }
      }
    }
    
    
    
    var Object1 = new Test();
    var Object2 = new Test();
    
    var EState = {
      ONE: 1,
      TWO: 2,
    };
    
    Object1.SetState(EState.ONE);
    Object2.SetState(EState.TWO);
    console.log(Object1.GetState());
    console.log(Object2.GetState());

    【讨论】:

    • 感谢您发现我的错字。我刚刚删除了我的其他帖子,因为没有人需要这个网站被一堆错字问题污染。但是,我刚刚阅读了您的其他几篇帖子,并为那些应得的以及他们自己独立的优点的人添加了 +1,从而表达了对您的感激之情。
    猜你喜欢
    • 1970-01-01
    • 2021-03-25
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 2014-11-13
    • 2014-12-12
    • 1970-01-01
    相关资源
    最近更新 更多