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

标签 javascript module reference closures encapsulation

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

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() );

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

最佳答案

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

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

这样,当您设置 key 时,setter 会删除输入值并保留原始初始值。

关于JavaScript 封装数据的闭包可以被规避吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40673756/

相关文章:

javascript - Bootstrap Scrollspy & Affix 不响应正文边距

javascript - webpack/src 根目录之外

javascript - 嵌入 Facebook 帖子的完整评论

module - 将 jspm 与 TypeScript 结合使用

java - 无法在方法中访问数组?

c# - 你如何在 C++ 中调用 C# 方法?

javascript - 在 Code.gs 中使用 javascript 从数组值动态 html 表

module - 如何运行此代码而不出现语法错误?

module - typescript :导入类的 'Cannot find name'错误

C++通过引用其他类传递二维数组