2014-06-10 59 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());