在内容脚本和主加载项脚本之间传递RegExp对象

时间:2012-08-20 09:45:23

标签: javascript firefox-addon firefox-addon-sdk

我遇到了一个问题,我在内容脚本中创建了一个RegExp对象,并使用self.port.emit()将其作为对象的一部分传递回主脚本。 在某个地方它似乎失去了它作为RegExp的身份以及它的toString能力。以下内容在主脚本中返回false,但在内容脚本中为true:

Object.prototype.toString.call(regexp) == '[object RegExp]';
regexp instanceof RegExp;

有趣的是,对于以相同方式传递的数组,以下是正确的:

Object.prototype.toString.call(array) == '[object Array]'; 

我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

如果你刚刚发送了正则表达式而不是整个正则表达式对象呢?例如encodeURIComponent(regexp.source);

答案 1 :(得分:1)

附加SDK不会在您发送消息时传递对象,只传递字符串 - 它实际上在一侧调用JSON.stringify(),然后在另一侧调用JSON.parse()。结果很容易预测:

console.log(JSON.stringify(new RegExp()));

这会给你"{}"。换句话说,JSON.stringify()将“自定义”对象视为普通对象而没有任何属性,对象原型等被忽略。您在主代码中获得的是一个普通对象,就像您调用new Object()一样。

如果您需要将正则表达式传递给主代码 - 发送regexp.source,请在另一侧创建一个实际的正则表达式。无法发送实际物体。