应该是在应用程序逻辑处理之前克隆的输入数据对象?



i在开源项目上工作 - 对象文档映射aka。ODMjavascript中,面临着我与设计决定(而不是simple,但easy)。

ODM中,您可以定义一个Model对象,该对象在数据库中描述了您的数据文档。创建新的Model实例对象时,您可以通过参数传递其数据值。
伪代码:

var data = {
    username: 'james'
    email: 'james@email.com',
    country: {
        code: 'US',
        city: ''
    } 
};
// In case the data object would not be cloned, it would be mutated by the ODM
var user = new UserModel(data);

现在,我要面对的决定是是否要在应用程序处理(ODM)处理之前自动克隆data对象。我倾向于选择不克隆输入数据。我觉得在javascript社区中,克隆数据通常比必要的更受欢迎,因为它可以使最终用户的easy(不是simple)。从我的研究中,我发现一些类似且受欢迎的项目决定克隆数据,但我不确定考虑到模型是否可以具有较大的AMP;这是正确的选择。复杂的数据架构,尽管对于数十个Model实例对象没有任何影响,但我认为在使用EG。:数百个Model对象时可能是一个问题。

我很想听听您在主题上的理由,您的选择是什么?
如果您已经看到另一个答案,请随时写下您的想法!
谢谢!

如果您不断使用输入对象保存实体数据,则如果不克隆对象,您将面临以下问题:

var UserModel = function(data) {
  this.data = data;
}
UserModel.prototype.getUsername = function() {
  return this.data.username;
}
var data = {username: 'james'};
var james = new UserModel(data);
data.username = 'john';
var john = new UserModel(data);
console.log(james.getUsername()); // "john"
console.log(john.getUsername());  // "john"

这可能会导致一些可能并不总是显而易见的令人讨厌的错误。


我认为,最清洁的方法不是克隆,而是将相关信息从对象中提取并直接保留为成员属性:

var UserModel = function(data) {
  this.username = data.username;
  this.email = data.email;
}
UserModel.prototype.getUsername = function() {
  return this.username;
}
UserModel.prototype.getEmail = function() {
  return this.email;
}

更好,明确地将属性声明为构造函数的参数:

var UserModel = function(username, email) {
  this.username = username;
  this.email = email;
}

相关内容

  • 没有找到相关文章

最新更新