Javascript 带有requirejs和闭包的私有变量

Javascript 带有requirejs和闭包的私有变量,javascript,requirejs,closures,Javascript,Requirejs,Closures,我试图在requirejs中创建一个带有私有变量的类。意味着我不希望任何人访问这个变量,只能使用私有方法 numbox.js 这是不正确的,如果我创建任何新的Numbox实例并调用该方法,所有实例将共享相同的计数器,如下所示 require(['numbox.js'], function(Numbox){ var box1 = new Numbox(); var box2 = new Numbox(); box1.add_and_show(); // alert(1); box2

我试图在requirejs中创建一个带有私有变量的类。意味着我不希望任何人访问这个变量,只能使用私有方法

numbox.js 这是不正确的,如果我创建任何新的Numbox实例并调用该方法,所有实例将共享相同的计数器,如下所示

require(['numbox.js'], function(Numbox){
  var box1 = new Numbox();
  var box2 = new Numbox();
  box1.add_and_show(); // alert(1);
  box2.add_and_show(); // alert(2); instead of "1"
}
尽管我将计数器放在构造函数函数下,如下所示,它可以工作,但它并没有实现我的目标,因为我希望它是私有的。我仍然可以通过box1.counter或box2.counter访问计数器

numbox.js
请建议正确的方法。谢谢

如果您确实需要此技巧,您可能不需要,一种方法是跟踪私有范围中的实例和计数器,如下所示:

define(function(){

  var counters = [];
  var instances = [];

  function Numbox() {
    instances.push(this);
    counters.push(0);
  }

  Numbox.prototype = {
    addAndShow: function() {
      var idx = instances.indexOf(this);
      var counter = counters[idx]++;
      return counter;
    }
  };

  return Numbox;
});

var n = new Numbox();

console.log(n.addAndShow()); //=> 0
console.log(n.addAndShow()); //=> 1
console.log(n.addAndShow()); //=> 2

var n2 = new Numbox();

console.log(n2.addAndShow()); //=> 0
console.log(n2.addAndShow()); //=> 1

// More tests

console.log(n.addAndShow()); //=> 3
console.log(n2.addAndShow()); //=> 2

如果您确实需要此技巧,您可能不需要,一种方法是跟踪私有作用域中的实例和计数器,如下所示:

define(function(){

  var counters = [];
  var instances = [];

  function Numbox() {
    instances.push(this);
    counters.push(0);
  }

  Numbox.prototype = {
    addAndShow: function() {
      var idx = instances.indexOf(this);
      var counter = counters[idx]++;
      return counter;
    }
  };

  return Numbox;
});

var n = new Numbox();

console.log(n.addAndShow()); //=> 0
console.log(n.addAndShow()); //=> 1
console.log(n.addAndShow()); //=> 2

var n2 = new Numbox();

console.log(n2.addAndShow()); //=> 0
console.log(n2.addAndShow()); //=> 1

// More tests

console.log(n.addAndShow()); //=> 3
console.log(n2.addAndShow()); //=> 2

你不可能什么都有。正如圣人所说,你会把它放在哪里

在这种情况下,您真正不能拥有的是原型函数可以访问的完全封装的数据。正如埃尔克兰斯所说,如果你愿意放弃隐私权,那么你就是第二个例子。另一方面,如果隐私比内存更重要,您可以这样做:

define(function(){
    function Numbox(){
        var counter = 0;
        this.add_and_show=function(){
            counter++; alert(counter);
        }
    }
    return Numbox;
}

现在柜台是完全私人的。但是每个Numbox实例都有自己的add_和_show的私有副本。你可以自己决定权衡。但我从未见过任何一种技术可以同时实现这两个目标。

你不可能拥有一切。正如圣人所说,你会把它放在哪里

在这种情况下,您真正不能拥有的是原型函数可以访问的完全封装的数据。正如埃尔克兰斯所说,如果你愿意放弃隐私权,那么你就是第二个例子。另一方面,如果隐私比内存更重要,您可以这样做:

define(function(){
    function Numbox(){
        var counter = 0;
        this.add_and_show=function(){
            counter++; alert(counter);
        }
    }
    return Numbox;
}

现在柜台是完全私人的。但是每个Numbox实例都有自己的add_和_show的私有副本。你可以自己决定权衡。但我从未见过任何技术可以同时实现这两个目标。

你的第二个版本很好,JavaScript中没有私有和公共这两种东西。我得说别担心。如果你真的想这样做,你必须以某种方式跟踪实例和计数器。你的第二个版本是好的,JavaScript中没有私有和公共这样的东西。我得说别担心。如果你真的想这样做,你必须以某种方式跟踪实例和计数器。这是可行的,但如果Numbox实例通常会超出范围并被垃圾收集,那么它就会成为内存泄漏。因为这个闭包保留了对它们的引用,所以当时没有任何东西会删除它们。是的,我理解。这就是为什么我不认为这是必要的。我想,当你不再需要引用时,你总是可以手动删除它。为了澄清这一点,你应该让数组有一个未定义的洞,并继续使用新实例。大型数组通常不是问题。是的,但是这将涉及知道元素何时被销毁,以及添加破坏或某种机制,我们从C++中得到的所有东西,爱。是的,这是一种合法的技术,我自己也用过。但我只推荐它用于长寿命的物体,我通常发现我很少有很多长寿命的物体,在这种情况下,我可以选择更简单的使用量子技术来实现这一点。。。这是可行的,但如果Numbox实例通常会超出范围并被垃圾收集,则会导致内存泄漏。因为这个闭包保留了对它们的引用,所以当时没有任何东西会删除它们。是的,我理解。这就是为什么我不认为这是必要的。我想,当你不再需要引用时,你总是可以手动删除它。为了澄清这一点,你应该让数组有一个未定义的洞,并继续使用新实例。大型数组通常不是问题。是的,但是这将涉及知道元素何时被销毁,以及添加破坏或某种机制,我们从C++中得到的所有东西,爱。是的,这是一种合法的技术,我自己也用过。但我只推荐它用于长寿命的物体,我通常发现我很少有很多长寿命的物体,在这种情况下,我可以选择更简单的使用量子技术来实现这一点。。。我建议。正如你们所建议的,我不再介意私有变量,我在示例2中所做的似乎是我最想要的。正如你们所建议的,我不再介意私有变量,我在示例2中所做的似乎是我最想要的。