我正在尝试构建一个 JavaScript 构造函数,它具有一个数组作为具有只读访问权限的属性:
var Word = function() {
var _occurrences = [];
Object.defineProperties(this, {
"occurrences": {
get: function() {
return _occurrences;
}
},
"addOccurence": {
value: function(occ) {
_occurrences.push(occ);
}
}
});
};
数组本身是一个私有(private)变量,有一个 get-er 指向它。
var myWord = new Word();
myWord.addOccurrence(123);
var occ = myWord.occurrences;
一切正常。
myWord.occurrences = [];
被阻止,这是应该的。但令人惊讶的是,这有效:
myWord.occurrences.push(321);
保护一个属性可以防止它被新赋值,但不能通过 Array 方法进行写访问——即使它只能通过 getter 访问。这使得 Object.defineProperty()
对我来说毫无意义。
Object.freeze()
/Object.seal()
不是一个选项,因为我的 addOccurrences()
方法需要写权限.
有什么想法吗?我是否忽略了什么?
最佳答案
JavaScript 只为您提供对对象(包括数组)的引用。当您返回 _occurrences
时,您返回了对数组的引用,因此您可以对其进行操作。
如果你想阻止这种情况,返回一个数组的副本。
return _occurrences.concat();
关于javascript - 数组作为 JavaScript 中 protected 对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24307897/