可以绕过用于封装数据的JavaScript闭包
JavaScript closures for encapsulating data can be circumvented?
我一直认为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()
范围内定义的变量)不能从外部突变?
应该使用getter和setter。下面的MDN示例应该能够返回相同的值,即使设置不同:
function creator() {
var x = {
get key() {
return 4;
},
set key(x) {
// do nothing
}
};
return function() {
return x;
}
}
这样,当您设置key时,setter会删除输入值并保留初始值。
相关文章:
- 如何在上传前在浏览器中去除图像元数据(javascript)
- 从JSON对象中删除额外的括号和数据 - Javascript
- 测试两个变量是否包含一些数据 JavaScript
- 追加 POST 数据 javascript
- 通过设置SRC数据Javascript平滑淡入图像RGB
- 列出json数据javascript
- Yahoo api 从公共数据 JavaScript 切换到 oAuth
- 对恶意用户隐藏数据 JavaScript 函数
- JavaScript:如何预加载<对象>图像数据?/ JavaScript 的图像与<对象>
- 张贴base64数据JavaScript/jQuery
- 自动求和和和追加数据javascript
- 在数据Javascript上迭代时删除对象中以前的项
- 获取值数据
javascript - 获取数据javascript和推到数组Cordova
- 如何在用户单击提交按钮之前从输入框读取数据?(JavaScript)
- 在函数中传输数据?Javascript
- .filter在HTML表上不返回数据- JavaScript
- JSON数据&JavaScript(试图找到错误,可能只是语法)
- 图表数据javascript
- 不能给ajax加载的数据javascript