2014-06-10 61 views
0

我在对象中保存了一个函数。javascript:将函数保存到对象

var obj = { 
    name: 'bob', 
    getName: function() { 
    return this.name; 
    } 
}; 
console.log(obj.getName()); 

它显示'bob'。 但是,当我将此obj保存到Session或MongoDB时,该功能消失了。

Session.set('tmp', obj); 
var tmpObj = Session.get('tmp'); 
console.log(tmpObj.getName()); 

这表明未定义。

我测试过JSON.stringify /解析也是行不通的。

如何在对象中保留函数?

回答

0

在大多数情况下是不可能的。从技术上讲,你可以使用序列化一个obj.getName.toString()功能,它应该返回

function() { 
    return this.name; 
} 

然后,您可以用类似eval("(" + functionString + ")()")运行它。但是这总是一个糟糕的主意。

如果您想将其存储到MongoDB中,您可能需要使用Mongoose ODM和定制setter。这允许你在Schema上定义一个描述存储在MongoDB中的对象的函数,它应该满足你的需求。

var objSchema = new Schema({ 
    name: { 
    type: String, 
    get: function(name) { 
     return name; //Of course, you could manipulate this more if you want. 
    } 
    } 
}); 
+0

我认为猫鼬可能是解决方案之一。但是我的一些人告诉我,猫鼬有很多缺点。但是,谢谢让我知道。 – jwjin

0

在大多数情况下,您不能保存功能。尝试把所有的变量为基本属性,而不是,并重新载入“哑”对象之后,用这样的方法重新初始化:

var ObjMaker = function(attrs){ 
    this.name = attrs.name; 
} 

ObjMaker.greet = function(){ 
    return 'Hello ' + this.name; 
} 

var reloadedObj = { name: 'bob' }; 

var obj = new Obj(reloadedObj); 

console.log(obj.greet());