繁体   English   中英

在JavaScript中声明私有静态成员变量

[英]Declaring private static member variable in JavaScript

我被JavaScript的设计模式所困扰,我想创建一个私有的静态成员变量来保持对象计数。 遵循以下原则:

var person = function(name){
    //How to persist this value across multiple calls avoiding Globals
    var _personCount = _personCount || 0;
    _personCount++;
    var _name = name;
    getPerson = function(){
          return "Person is: " + _name;
    }
};

person("foo");//_personCount should be 1 after this call
person("bar");//_personCount should be 2 after this call

这个想法类似于私有静态变量,只能由类的内部变量访问

您可以使用显示模块模式

var something = (function() {
  var myThing = 0;

  return {
    doSomething: function() {
      myThing++;
    }
  };
})();

something.doSomething(); // myThing is now 1

该变量位于所谓的IIFE(立即调用的函数表达式)中,它将在程序的整个生命周期中保持不变。

如果要在不同位置多次实例化模块,则还需要创建一个singleton

如果要使变量对所有人都是全局变量,则需要在包含函数的范围内定义它们。 这可以是IIFE,因为它只需要运行一次。

var person = (function() {
    var _personCount = _perconCount || 0;
    return function(name) {
        _personCount++;
        var _name = name;
        getPerson = function() {
            return "Person is: " + _name;
        };
    };
})();

您必须在闭包上下文中创建私有静态变量。

var person = (function() {
    //private variable
    var _personCount = 1;

    return function(name) {
        this.name = name;
        this.id = _personCount++;
    }

}());

var foo = new person('foo');
console.log(foo.id + ' ' + foo.name);//1 foo

var boo = new person('boo');
console.log(boo.id + ' ' + boo.name);//2 boo

这里封闭的匿名函数再也不会被调用。 它在JS引擎解析您的代码时执行,并创建_personCount变量,该变量只能由内部函数function(name)进行访问,从而使其像private static。

我认为这可以帮助您! 注意:具有实例方法的prototype属性! 注意:计数是静态的!

 var Person = (function() { var counter = 0; function Person(name) { this.name = name; } Person.prototype.getName = function() { counter += 1; return this.name; }; Person.count = function() { return counter; }; return Person; })(); var superman = new Person('SuperMan'); var batman = new Person('BatMan'); var el = function() { return window.document.getElementById('counter'); } function p1() { var name = superman.getName(); el().innerText = name + ' - ' + Person.count(); } function p2() { var name = batman.getName(); el().innerText = name + ' - ' + Person.count(); } 
 <h1 id="counter">0</h1> <button onclick="p1()">Person1</button> <button onclick="p2()">Person2</button> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM