我在chrome扩展程序的内容脚本中使用简单的自定义类型。然后通过chrome.extension.sendRequest()将项目数组发送到后台页面。在bgpage调试器中显示我的类型的实例没有这些方法。此外,具有未定义值的类型属性也会发生相同的情况。怎么了。
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 :(得分:0)
消息传递使用JSON.stringify
,它会在对象进行字符串化时删除对象中的函数。
为什么?一个函数不仅仅是代码 - 它是一个带有变量/范围信息的closure。如果函数使用全局变量并且函数移动到新的执行环境,它应该如何表现? (事实上,问题远比“它应该如何表现?”更为深刻,它更像是“函数范围内的所有变量如何与函数一起传输?”。
如果要传输功能代码(事先知道目标中存在必要的变量),可以在成员函数上使用toString
来传输字符串并使用eval
在抵达时重新创建它们。
(JSON.stringify
也会删除undefined
值的成员。例如,JSON.stringify({"a":undefined})
会产生"{}"
。如果您希望保留这些值,请将它们设置为{ {1}}。设置为null
的成员变量与根本没有设置的成员变量无法区分。)