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都是相当新的标准,在不同的浏览器中没有太多的支持。MichaelDibbetsload
函数在逻辑上是等价的(不包括额外的时间戳
逻辑),可以在任何地方工作,但性能可能稍差。是的,对象创建和分配将使用本机代码来执行逻辑,这将比我的代码将实现的解释jit代码快得多。但是,在旧浏览器上,internet explorer怀疑使用create
和assign
代码可能会导致一些问题。在那里,您可以使用我的代码作为条件注释中的备用代码@zatziky Oh angular也有一个版本的assign(也称为extend
):(仍然比Michael的答案慢)谢谢。从代码来看,它似乎是有效的。我实现了@Paulpro提供的解决方案。
var objectWithLogic = _.assign(new MyObject(), data);