2012-05-10 67 views
0

我在Chrome擴展的內容腳本中使用簡單的自定義類型。然後通過chrome.extension.sendRequest()將項目數組發送到後臺頁面。在bgpage調試器中顯示我的類型的實例沒有這些方法。而且,具有未定義值的類型屬性也會發生同樣的情況。怎麼了。爲什麼方法丟失自定義對象sendRequest()

function User(id, holder) { 
    this.id = id; 
    var hObj = {}; 
    hObj[holder] = 'undefined'; // this is ok 
    this.holder = hObj; 
    this.Result = undefined; // this will be lost 
    this.Code = undefined; // this will be lost 
} 
// this will be lost 
User.prototype.getFirstHolderType = function() { 
    for (h in this.holder) { 
    if (h) return h; 
    } 
    return false; 
}; 
// this will be lost 
User.prototype.hasHolderType = function(h_type) { 
    for (h in this.holder) { 
    if (h_type === h) return true; 
    } 
    return false; 
}; 

//... 

chrome.extension.sendRequest({id: "users_come", users: users}, 
      function(response) {}); 

回答

0

消息傳遞使用JSON.stringify,它將字符串化時的函數從對象中刪除。

爲什麼?函數不僅僅是代碼 - 它是一個帶有大量變量/範圍信息的closure。如果一個函數使用一個全局變量並且該函數移動到一個新的執行環境中,它應該如何表現? (事實上​​,這個問題比「它應該如何表現?」要深刻得多,更像是「函數內的所有變量如何與函數一起傳輸?」。)

如果你想要運輸您的功能代碼(並且事先知道目標位置存在必要的變量),您可以在您的成員功能上使用toString將它們傳送給一個字符串,並使用eval在到達時重新創建它們。

JSON.stringify也下降具有一undefined值的成員。例如,JSON.stringify({"a":undefined})產生"{}"。如果您希望這些值被保存,將它們設置爲null。成員變量設置爲undefined距離,這是一個成員變量區分從來沒有設置。)

+0

'toString'將包含我的方法的長字符串字面量還是有任何其他方法序列化它? – Vasya

+0

我認爲傳遞函數的全文是這裏最好的解決方案。另外,請注意,您可能需要在函數字符串的每一端添加括號,因爲'eval(「function(){}」)'失敗,但是eval(「(function(){})」)'成功。 – apsillers