【问题标题】:Javascript simulate real private variable and manage it with getter/setterJavascript 模拟真正的私有变量并使用 getter/setter 管理它
【发布时间】:2015-06-21 01:43:00
【问题描述】:

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

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

【问题讨论】:

  • 您的问题到底是什么?你不能模拟一下吗?
  • privateProp 是一个 public 属性,因为您可以在函数之外对其进行修改。 _private 是一个 私有 变量。也可以使用 ES6 符号来完成,但我不确定你到底要什么
  • 我想我尝试找到最佳实践

标签: javascript private encapsulation setter getter


【解决方案1】:

没有正确方法可以模拟私有变量,因为它们不是 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;
  };
}

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

【讨论】:

    猜你喜欢
    • 2014-03-27
    • 2020-11-08
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    相关资源
    最近更新 更多