静态私有字段Javascript

Static private field Javascript

本文关键字:Javascript 字段 静态      更新时间:2023-09-26

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

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是非私有的。我知道如何创建私有变量,但不知道如何生成私有静态变量。

没有办法(据我所知)以您描述的方式复制私有静态成员。

为了解决id生成器的安全问题,您可以使用模块模式,并在模块范围内对其进行某种特权访问。

// 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

您可以做的是:

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的一种奇怪方式,但这只是为了说明原型函数也可以访问这些私有变量)。

在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); }

如果你真的想隐藏一些东西,你当然可以使用闭包,正如其他人所说的那样。然而,这有点难以调试,而且由于某种原因,调试速度有点慢。