静态私有字段Javascript

时间:2016-03-29 20:40:14

标签: javascript oop static

我需要使用唯一Objects初始化一些name的构造函数。我写了一些像这样的代码:

Obj.prototype.idCounter = 0;
Obj = function() {
   this.name = "Obj_" + Obj.prototype.idCounter;
   Obj.prototype.idCounter++;
}

var o1 = new Obj();
var o2 = new Obj();
alert(o1.name); // Obj_0
alert(o2.name); // Obj_1

Obj.prototype.idCounter是非私人的。我知道如何创建私有变量,但我不知道如何创建私有静态变量。

3 个答案:

答案 0 :(得分:3)

你可以做的是:

var Obj = function() {
    var idCounter = 0;

    function Obj() {
       this.name = "Obj_" + idCounter;
       idCounter++;
    }
    return Obj;
}();

现在idCounter是该匿名函数的局部变量,因此除了构造函数之外没有其他任何东西可以看到它。

请注意,您也可以在那里对原型对象进行一些初始化:

var Obj = function() {
    var idCounter = 0;

    function Obj() {
       this.name = "Obj_" + idCounter;
       idCounter++;
    }
    // one way to add a prototype property, and not
    // the simplest
    Object.defineProperties(Obj.prototype, {
      getInstanceCount: {
        value: function() {
          return idCounter;
        }
      }
    });
    return Obj;
}();

现在当你有一个Obj实例时,你可以调用getInstanceCount()来获得创建的对象总数(这可能是设计API的一种奇怪的方式,但它只是为了说明原型函数可以访问那些私人变量也是如此。

答案 1 :(得分:3)

There is no way (as far as I know) to replicate private static members the way you described it.

What you could do to solve the problem of keeping your id generator safe is to use the module pattern, and use a sort of privileged access to it from within the module scope.

// using an immediately invoked function to generate the isolated scope
var Obj = (function () {
    var idCounter = 0;

    return function Obj() {
        this.name = "Obj_" + idCounter;
        idCounter++;
    };
}());

var o1 = new Obj();
var o2 = new Obj();
alert(o1.name); // Obj_0
alert(o2.name); // Obj_1

答案 2 :(得分:0)

在JavaScript中,您通常使用下划线_为字段名称添加前缀,以表明它们是私有的。当然,这并不能使它们真正私密,但开发人员应该表现出一些自律,并将其视为私人。

function Obj() {
  this.name = "Obj_" + (Obj._idCounter++);
}
Obj._idCounter = 0;

var o1 = new Obj();
var o2 = new Obj();
log(o1.name); // Obj_0
log(o2.name); // Obj_1

function log(x) { var p = document.createElement('pre'); p.appendChild(document.createTextNode(x)); document.body.appendChild(p); }

如果你真的想要隐藏某些东西,你当然可以使用闭包,正如其他人所说。然而,这有点难以调试,出于某种原因,这是一个bit slower