使用逻辑

时间:2016-03-03 06:57:57

标签: javascript javascript-objects

我相信解决我的问题相对容易。我只是没有看到它。

我有一个对象:

function MyObject(){
  this.attr = "anything";
}

MyObject.prototype.doSomething = function(){
   // logic
}

我使用new MyObject()创建对象。我使用它,当我想退出我的工作时,我只需将其存储到数据库(mongodb)。在mongo中,它以这种方式存储:

{ "attr" : "anything" }

当我从数据库加载对象时,我只有没有任何逻辑的普通对象文字。方法很缺失。我可以看到原因;)但我不知道如何再次将逻辑添加到对象文字...

问题

如何再次使用原始逻辑装饰检索到的对象?所以它再次看起来像这样:

{       
  "attr" : "anything",
  "doSomething": doSomething()
} 
  • 怎么做呢?
  • 有没有其他方法(除了存储方法和所有原型层次结构)?

3 个答案:

答案 0 :(得分:4)

创建一个加载函数,将您获得的对象的所有属性加载到您自己的对象中。

您可以将对象属性名称作为关联数组索引访问。

因此myobj.attrmyobj['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);