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

Noz*_*rum 6 javascript google-chrome

我正在开发一个chrome扩展,我想用chrome.runtime.sendMessage发送一个对象(带有一些函数).

现在做这样的事情

chrome.runtime.sendMessage({something: "Funny"}); 
Run Code Online (Sandbox Code Playgroud)

工作得很好.但是,只要我想创建更复杂的东西,我的消息似乎就是一个空对象.

function FunnyFunction() {
    return 42;
}
var exampleObject = new Object();
exampleObject.FunnyFunction = FunnyFunction;

chrome.runtime.sendMessage({something: exampleObject });
Run Code Online (Sandbox Code Playgroud)

现在在接收端,它成功地注册了一条消息,并检测到它有一个键"某事".但是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);
        }
    }
);
Run Code Online (Sandbox Code Playgroud)

请求始终是一个对象

Object {something: Object}
Run Code Online (Sandbox Code Playgroud)

但是'something'背后的对象,应该是exampleObject - 我之前用2个函数定义的对象 - 总是空的.

Object {}
Run Code Online (Sandbox Code Playgroud)

当我尝试做exampleObject.FunnyFunction(); 它显然崩溃了,因为它没有这样的成员.

我在这做错了什么?

nbu*_*urr 5

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

  • 实际上可以对函数进行字符串化吗? (2认同)