Javascript模拟真实的私有变量,用getter/setter管理

Javascript simulate real private variable and manage it with getter/setter

我这样模拟私有变量是否正确?

var C = function(a) {
    var _private = a + 1;
    // more code...
    Object.defineProperties(this, {
        'privateProp': {
            get: function() {
                return _private;
            },
            set: function(b) {
                _private = b + 2;
            }
        }
    });
}

因此,使用 getter/setter 我可以管理该私有变量。它的值可以是 get/set 使用自定义方法。

比方说这个例子

var c = new C(5);

console.log(c.privateProp); // 6
c.privateProp = 2;
console.log(c.privateProp); // 4

没有正确的方法来模拟私有变量,因为它们不是Javascript规范的一部分。

但是,仍然有很多方法可以模拟它们:

有 getter 和 setter

这与您的答案相同,但语法略有不同:

function Rocket() {
  var _fuel = 100;

  return {
    get fuel() {
      return _fuel;
    }
    set fuel(value) {
      _fuel = value;
    }
  };
}

此语法允许您以更自然的方式定义 getter 和 setter 函数,但有一个限制,即它们必须在对象字面量内。

关闭

function Rocket() {
  var fuel = 100;

  return {
    getFuel: function() { return fuel; },
    setFuel: function(value) { fuel = value; }
  };
}

这可以说是最优雅的方式,因为自从将匿名函数添加到规范以来,这就是 Javascript 的工作方式。

按照惯例

function Rocket() {
  this._fuel = 100;

  this.getFuel = function() {
    return this._fuel;
  };

  this.setFuel = function(value) {
    this._fuel = value;
  };
}

最后一种方法是将变量公开为public,但通过在名称开头使用下划线将其标记为私有