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()
范围内定义的变量不能从外部改变?
你应该使用 getters and setters 。按照 MDN 示例,即使设置不同,您也应该能够 return 相同的值:
function creator() {
var x = {
get key() {
return 4;
},
set key(x) {
// do nothing
}
};
return function() {
return x;
}
}
这样当您设置键时,setter 丢弃输入值并保留原始初始值。
我一直认为 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()
范围内定义的变量不能从外部改变?
你应该使用 getters and setters 。按照 MDN 示例,即使设置不同,您也应该能够 return 相同的值:
function creator() {
var x = {
get key() {
return 4;
},
set key(x) {
// do nothing
}
};
return function() {
return x;
}
}
这样当您设置键时,setter 丢弃输入值并保留原始初始值。