这个问题已经困扰我一段时间了。我正在尝试考虑设计一个 API 的最佳方法,该 API 可以让您访问用户所需的数据,但基于 API 其余部分所依赖的一些内部对象。这是一个简单的例子
function Person(name, ...) {
this.name = name;
this._friends = [];
...
}
Person.prototype.addFriend = function(friend){
this._friends.push(friend);
};
var bob = new Person("Bob", ...);
var alice = new Person("Alice", ...);
var tut = new Person("Tutankhamun", ...);
bob.addFriend(alice);
bob.addFriend(tut);
(我知道在“私有(private)”变量前加上 _ 并不能真正使其对公众隐藏。但我更喜欢使用原型(prototype)而不是一直在构造函数内重新定义函数。据我所知,你可以'不要在原型(prototype)中使用 Douglas Crockford 风格的私有(private)变量。无论如何,我认为这是一个不同的问题。)
现在假设我们想要向 API 用户公开一种方式来查看谁是 Bob 的 friend 。最简单的方法是返回好友数组:
Person.prototype.getFriends = function() {
return this._friends;
};
但是如果一些流氓开发者决定这样做怎么办?
bob.getFriends().pop();
哦天哪,可怜的图坦卡蒙。这是多么可怕的误会啊!鲍勃还是喜欢图坦卡蒙!我能想到解决此问题的唯一方法是每次都克隆 friend 对象,如下所示:
Person.prototype.getFriends = function() {
return this._friends.slice(0);
};
但是你每次都必须克隆它。对于大型对象,这可能是一个问题。
那么有没有更好的方法来设计这个API以允许访问内部数据而不允许修改?
最佳答案
虽然你是正确的,有潜力 tradeoff虽然克隆对象时性能会降低,但它是迄今为止最直接且最简单的解决方案。
查找 nice implementation用于深度克隆对象,并在返回时应用。
Person.prototype.getFriends = function() {
return _.cloneDeep(this._friends);
};
关于javascript - 允许访问内部对象但阻止外部修改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21618896/