我正在开发一个 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 });
现在在接收端它成功地注册了一条消息并且还检测到它有一个键“something”。 但是 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();它显然崩溃了,因为它没有这样的成员。
我在这里做错了什么?
最佳答案
您不能通过消息传递 API 传递函数,因为它使用序列化的 JSON 作为数据交换格式,不支持将函数作为基本类型。理想情况下,您应该已经在需要它的上下文(即背景/事件页面、弹出页面等)中拥有可用的功能,但是在您需要将功能从扩展的一部分传递到另一部分的情况下,您需要使用 JSON.stringify
将函数序列化为 JSON 字符串,并在另一端使用 JSON.parse
将 JSON 字符串反序列化为原始函数,然后您可以利用它。
关于javascript - 通过 chrome.runtime.sendMessage 发送带有函数的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32814553/