【问题标题】:How to make a static array in javascript class?如何在javascript类中创建一个静态数组?
【发布时间】:2011-03-09 10:52:58
【问题描述】:

一个类是用 javascript 创建的。我在不同的其他脚本中创建它的对象。但是我需要它的一个数据成员(数组)是静态的吗? 每次我创建该类的新对象时,它都不应该丢失该数组数据。我需要旧的数组数据...

【问题讨论】:

  • 首先:JavaScript 中没有类。您的意思是您希望每个对象开始 的属性设置为默认值数组,但之后可以在每个对象上独立修改该数组?
  • 不,Javascript 没有类。不过,有一些被广泛使用的骇人听闻的方法来伪造它们。
  • 我的理解是否正确,“静态”是指无论哪个用户登录您的网站或应用程序,变量都是相同的?
  • @Ali - 我的理解是我们谈论的是静态成员,即在类的所有实例中具有持久性的数据。不是跨整个系统内的所有用户或会话?
  • @johnnumber:在后端代码(比如说Java)中,静态成员不就是这样工作的吗?不是所有会话都一样吗?

标签: javascript arrays class static


【解决方案1】:

您可以使用构造函数上的属性来模拟静态成员。在下面的示例中,我们有一个带有构造函数Foo 的伪类。当我们创建 Foo 的实例时,对该实例的引用被添加到 Foo 的静态 instances 属性中。

function Foo () {
    this.description = ' this is the Foo class';
    Foo.instances.push(this); // static member keeps ref to each instance
};

// this is an instance member
Foo.prototype.getDescription = function () {
    return this.description;
}

// this is a static member
Foo.instances = [];

所以我们在这里真正谈论的是使用构造函数作为“命名空间”来保存在某种程度上与“类”相关的变量。它比使用全局变量更好,因为它更干净一些。正如其他人所说,没有这样的类,但如果您喜欢以经典的方式思考,这种模式在概念上接近静态成员。

【讨论】:

    【解决方案2】:

    只需创建一个全局变量。

    <script>
        var myGlobalArray = [];
    </script>
    

    【讨论】:

    • 我认为他需要为所有使用网站的用户实例提供相同的东西。
    • +1。对“使一切都成为对象”(即使在非 OO 语言中!wtf?!)的不健康痴迷是这里的问题。正如 Jakub 所说,将其设为全局变量,然后继续
    • @Ali:我没有看到任何证据。
    【解决方案3】:

    诀窍是创建一个私有变量并在构造函数中定义原型方法,以便能够在闭包中使用私有变量。

    那么,这可能接近你想要的吗?

    function Foo(){
      var staticArr = [];
      if (!('prototypemethodsset' in Foo)){
          var proto = Foo.prototype;
          proto.getArr = function(){
              return staticArr;
          };
          proto.addArr = function(){
               staticArr.push(Array.prototype.slice.call(arguments));
          };
          proto.prototypemethodsset = true;
      }
    }
    
    var f = new Foo
      , g = new Foo;
    
    f.addArr(1,4,8,9,13,7);
    g.addArr(5,7);
    alert(g.getArr()); //=> 1,4,8,9,13,7,5,7
    alert(f.getArr()); //=> 1,4,8,9,13,7,5,7
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-26
      • 1970-01-01
      • 2018-02-26
      • 2015-02-12
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多