Javascript 用逻辑加载对象

Javascript 用逻辑加载对象,javascript,javascript-objects,Javascript,Javascript Objects,我认为解决我的问题相对容易。我就是看不出来 我有一个目标: function MyObject(){ this.attr = "anything"; } MyObject.prototype.doSomething = function(){ // logic } 我使用新建MyObject()创建对象。我使用它,当我想退出我所做的事情时,我只需将它存储到数据库(mongodb)中。在mongo中,其存储方式如下: { "attr" : &q

我认为解决我的问题相对容易。我就是看不出来

我有一个目标:

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

MyObject.prototype.doSomething = function(){
   // logic
}
我使用
新建MyObject()
创建对象。我使用它,当我想退出我所做的事情时,我只需将它存储到数据库(mongodb)中。在mongo中,其存储方式如下:

{ "attr" : "anything" }
当我从数据库加载对象时,我只有纯对象文本,没有任何逻辑。缺少这些方法。我明白为什么;)但我不知道如何再次将逻辑添加到对象文本中

问题

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

{       
  "attr" : "anything",
  "doSomething": doSomething()
} 
  • 如何简单地做到这一点
  • 是否有其他方法(除了存储方法和所有原型层次结构)
您可以使用从原型创建对象而不调用构造函数,然后使用将检索到的对象的属性分配给新创建的对象:

var fullObject = Object.assign( Object.create( MyObject.prototype ), retrievedObject );
例如:

函数MyObject(){
this.attr=“任何”;
}
MyObject.prototype.doSomething=函数(){
document.body.innerHTML=this.attr;
}
//从数据库检索到的普通对象
var retrievedObject={
“attr”:“foobar”
};
//具有适当原型和属性的对象
var myObject=Object.assign(Object.create(myObject.prototype)),retrievedObject;

myObject.doSomething()创建一个加载函数,将您得到的对象的所有属性加载回您自己的对象中

可以将对象特性名称作为关联数组索引进行访问

因此
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();
             }
        }
      }
   }
}
函数MyObject(数据){
if(数据类型!==‘未定义’){
这个。加载(数据);
}
否则{
this.attr=“任何”;
}
}
MyObject.prototype.doSomething=函数(){
//逻辑
}
MyObject.prototype.load=函数(数据){
for(var输入数据){
if(data.hasOwnProperty(key)){
此[键]=数据[键];
//只需进行样本验证检查。你想做什么就做什么。
如果(键==“时间戳”){
if(此[键]
对@paulpro答案的扩展,我不得不稍微修改这段代码
Object.create(MyObject.prototype)
。当我以这种方式使用继承对象时,它没有正确地实例化
private
成员。我只是将
Object.create(MyObject.prototype)
替换为
newmyobject()
。就这样

更新日期:2016年5月3日

最安全的方法是使用


json不能保存函数。为什么没有您的模型(
MyObject
)作为一个模块,在初始化时,您可以将json从数据库传递给它以设置其状态?@antoniskamamis您可以提供一些示例代码吗?他主要关心的是将整个构造函数及其原型存储到数据库中,这是单凭json@antoniskamamis首先,JSON肯定可以做到这一点,任何东西都可以存储在JSON中,您只需要将其序列化为字符串,然后再次取消序列化即可。第二,这显然不是他主要关心的问题,事实上,他从来没有提到想要在db中存储函数,而是明确提到想要在从db中检索对象后装饰它。@zatziky不客气。我想不出有什么缺点,只是如果你尝试在客户端JS中使用同样的技巧,你应该知道Object.create,甚至Object.assign都是相当新的标准,在不同的浏览器中没有太多的支持。MichaelDibbets
load
函数在逻辑上是等价的(不包括额外的
时间戳
逻辑),可以在任何地方工作,但性能可能稍差。是的,对象创建和分配将使用本机代码来执行逻辑,这将比我的代码将实现的解释jit代码快得多。但是,在旧浏览器上,internet explorer怀疑使用
create
assign
代码可能会导致一些问题。在那里,您可以使用我的代码作为条件注释中的备用代码@zatziky Oh angular也有一个版本的assign(也称为
extend
):(仍然比Michael的答案慢)谢谢。从代码来看,它似乎是有效的。我实现了@Paulpro提供的解决方案。
var objectWithLogic = _.assign(new MyObject(), data);