我相信解决我的问题相对容易。我只是没有看到它。
我有一个对象:
function MyObject(){
this.attr = "anything";
}
MyObject.prototype.doSomething = function(){
// logic
}
我使用new MyObject()
创建对象。我使用它,当我想退出我的工作时,我只需将其存储到数据库(mongodb)。在mongo中,它以这种方式存储:
{ "attr" : "anything" }
当我从数据库加载对象时,我只有没有任何逻辑的普通对象文字。方法很缺失。我可以看到原因;)但我不知道如何再次将逻辑添加到对象文字...
问题
如何再次使用原始逻辑装饰检索到的对象?所以它再次看起来像这样:
{
"attr" : "anything",
"doSomething": doSomething()
}
答案 0 :(得分:4)
创建一个加载函数,将您获得的对象的所有属性加载到您自己的对象中。
您可以将对象属性名称作为关联数组索引访问。
因此myobj.attr
与myobj['attr']
相同。
这有助于动态地将数据插入到对象中,同时保持对数据的完全控制(我个人最喜欢的): - )
您可以添加一些额外的检查,以防止剩余数据或做任何你想要的额外的事情。例如,修改时间戳。
function MyObject(data){
if(typeof data !== 'undefined') {
this.load(data);
}
else {
this.attr = "anything";
}
}
MyObject.prototype.doSomething = function(){
// logic
}
MyObject.prototype.load = function(data) {
for(var key in data) {
if(data.hasOwnProperty(key)) {
this[key] = data[key];
// Just sample validation check. wahtever you want.
if(key == 'timestamp') {
if(this[key] < new Date().getTime()-4000) {
this[key] = new Date().getTime();
}
}
}
}
}
答案 1 :(得分:3)
您可以使用Object.create从原型创建对象而不调用构造函数,然后使用Object.assign将您检索到的对象的属性分配给新创建的对象:
var fullObject = Object.assign( Object.create( MyObject.prototype ), retrievedObject );
示例:
function MyObject(){
this.attr = "anything";
}
MyObject.prototype.doSomething = function(){
document.body.innerHTML = this.attr;
}
// Plain object retrieved from database
var retrievedObject = {
"attr" : "foobar"
};
// Object with proper prototype and properties
var myObject = Object.assign( Object.create( MyObject.prototype ), retrievedObject );
myObject.doSomething();
答案 2 :(得分:0)
@ paulpro答案的扩展,我必须修改这段代码Object.create( MyObject.prototype )
。由于我使用继承的对象,因此它没有正确地实例化private
成员。我只是将Object.create( MyObject.prototype )
替换为new MyObject()
。那就是它。
2016年5月3日更新
最安全的方法是使用lodash's assing。
var objectWithLogic = _.assign(new MyObject(), data);