用于封装数据的JavaScript闭包可以被规避吗?

时间:2016-11-18 09:43:17

标签: javascript module reference closures encapsulation

我一直认为JavaScript闭包是封装数据的一种完美方式,可以将变量设为私有。但是我最近意识到通过利用引用语义很容易打破这种模式:

function creator() {
  var x = {
    key: 3
  };
  return function() {
    return x;
  }
}

var instance = creator();

var y = instance();

y.key = 4;

//returns 4
//y is a refernce to x
console.log( instance() );

如何确保私有部分(creator()范围内定义的变量不能从外部变异?

1 个答案:

答案 0 :(得分:1)

您应该使用getters and setters 。在MDN示例之后,即使设置不同,您也应该能够返回相同的值:

function creator() {
  var x = {
    get key() {
      return 4;
    },
    set key(x) {
      // do nothing
    }
  };
  return function() {
    return x;
  }
}

这样设置键时,setter会丢弃输入值并保留原始初始值。