javascript - 允许访问内部对象但阻止外部修改?

标签 javascript node.js

这个问题已经困扰我一段时间了。我正在尝试考虑设计一个 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/

相关文章:

javascript - 如何在 Cloudant 的 _user 数据库中分配角色

javascript - 如何在 Angular js 中将授权 header 发送到 http 请求(版本 1.4.8)

javascript - React-Native(构建失败)

node.js - 在node.js中将include_type_name参数设置为true

JavaScript 挑战表单元素数组验证

javascript - 其他意外 token

javascript - Ui路由器刷新问题

json - 如何在 Express js json 响应中发送时间戳?

javascript - 并且不与 Loopback 中的其他查询字段一起使用

javascript - 从 YouTube 缩略图抓取调色板