通过chrome.runtime.sendMessage发送带有函数的对象

时间:2015-09-28 01:22:42

标签: javascript google-chrome

我正在开发一个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();它显然崩溃了,因为它没有这样的成员。

我在这里做错了什么?

2 个答案:

答案 0 :(得分:4)

您无法通过Message Passing API传递函数,因为它使用序列化的JSON作为数据交换格式,它不支持函数作为基本类型。理想情况下,您可能已经在您需要的上下文中使用该功能(即背景/事件页面,弹出页面等),但是,如果您需要将功能从扩展的一部分传递到另一部分,您需要使用JSON.stringify将函数序列化为JSON字符串,并在另一端使用JSON.parse将JSON字符串反序列化回原始函数,然后您可以使用它

答案 1 :(得分:1)

您无法通过消息传递API传递函数。根据您的要求,有两种可能的替代方案。

  1. 使用JSON.stringify序列化功能,使用JSON.parse反序列化
  2. 使用sendResponse函数将数据(在侦听器代码中生成的任何内容)发送回发起消息的位置,并从那里执行该功能。