我正在开发一个chrome扩展,我想用chrome.runtime.sendMessage发送一个对象(带有一些函数)。
现在做这样的事情
chrome.runtime.sendMessage({something: "Funny"});
工作得很好。但是,只要我想创建更复杂的东西,我的消息似乎就是一个空对象。
function FunnyFunction() {
return 42;
}
var exampleObject = new Object();
exampleObject.FunnyFunction = FunnyFunction;
chrome.runtime.sendMessage({something: exampleObject });
现在在接收端,它成功注册了一条消息,并检测到它有一个键“某事”。 但是exampleObject总是空的。内部没有任何功能。
chrome.runtime.onMessage.addListener(
function (request, sender, sendResponse) {
console.log("got message: ");
console.log(request);
if ('something' in request) {
exampleObject = request.exampleObject;
console.log(exampleObject);
}
}
);
请求始终是对象
Object {something: Object}
但是'something'背后的对象,应该是exampleObject - 我之前用2个函数定义的对象 - 总是空的。
Object {}
当我尝试做exampleObject.FunnyFunction();它显然崩溃了,因为它没有这样的成员。
我在这里做错了什么?
答案 0 :(得分:4)
您无法通过Message Passing API传递函数,因为它使用序列化的JSON作为数据交换格式,它不支持函数作为基本类型。理想情况下,您可能已经在您需要的上下文中使用该功能(即背景/事件页面,弹出页面等),但是,如果您需要将功能从扩展的一部分传递到另一部分,您需要使用JSON.stringify
将函数序列化为JSON字符串,并在另一端使用JSON.parse
将JSON字符串反序列化回原始函数,然后您可以使用它
答案 1 :(得分:1)
您无法通过消息传递API传递函数。根据您的要求,有两种可能的替代方案。
JSON.stringify
序列化功能,使用JSON.parse
反序列化sendResponse
函数将数据(在侦听器代码中生成的任何内容)发送回发起消息的位置,并从那里执行该功能。