i在开源项目上工作 - 对象文档映射aka。ODM
在javascript
中,面临着我与设计决定(而不是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;
}