Javascript模拟真实的私有变量并使用getter / setter进行管理

时间:2015-04-15 07:46:12

标签: javascript private encapsulation setter getter

我是否以这种方式正确使用私有变量模拟?

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,我可以管理该私有变量。并且可以使用自定义方法获取/设置它的值。

让我们说这个例子

var c = new C(5);

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

1 个答案:

答案 0 :(得分:7)

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

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

使用Getters和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,但在名称的开头使用下划线将其标记为私有。