Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何传递对象';在Chrome扩展的另一个页面上使用它的构造函数_Javascript_Google Chrome_Object_Google Chrome Extension_Constructor - Fatal编程技术网

Javascript 如何传递对象';在Chrome扩展的另一个页面上使用它的构造函数

Javascript 如何传递对象';在Chrome扩展的另一个页面上使用它的构造函数,javascript,google-chrome,object,google-chrome-extension,constructor,Javascript,Google Chrome,Object,Google Chrome Extension,Constructor,我正在创建一个Chrome扩展,在页面中注入一个iframe。扩展在3个页面之间传递数据(特别是对象):正在访问的页面、iframe内容和background.html 我正在传递使用构造函数创建的对象,如下所示: function url(href, anchorText, altText, linksOut){ this.href = href; this.anchorText = anchorText; this.altText = altText; thi

我正在创建一个Chrome扩展,在页面中注入一个iframe。扩展在3个页面之间传递数据(特别是对象):正在访问的页面、iframe内容和background.html

我正在传递使用构造函数创建的对象,如下所示:

function url(href, anchorText, altText, linksOut){
    this.href = href;
    this.anchorText = anchorText;
    this.altText = altText;
    this.linksOut = linksOut;
};
在控制台中,以这种方式创建的对象将如下所示:

url {href: "http://www.foo.com", anchorText: "Foo", altText: "", linksOut: Array[42]}
我还可以在控制台中看到附加到对象的构造函数:

__proto__: url
  constructor: function url(href, anchorText, altText, linksOut){
  ...
相关部分是,它具有对象/构造函数的名称。当我将访问页面中的数据传递到background.html时,问题就出现了。在此处拉起控制台,它已失去名称并成为通用(匿名?)对象:

我可以看到构造函数已经丢失:

__proto__: Object
  ...
  constructor: function Object() { [native code] }
  ...

所以问题是,有没有一种方法可以在页面之间传递一个对象并保留与它的构造函数的关联?

在后台页面和内容脚本之间发送的消息是JSON编码的对象。您的url对象被字符串化,然后在后台页面上解析,从而丢失其“标识”

A.)
如果您正在寻找将对象从内容脚本传递到后台页面的方法,则在后台页面中对其进行修改,并能够看到内容脚本中的更改,这是不可能的,因为对象是不同的。
也许,您可以通过使用侦听器的
sendResponse
回调来找到部分解决方法,但我怀疑这是否值得麻烦

B.)
如果您只需要获取从内容脚本发送的url对象的副本,还可以在后台页面中定义构造函数,并在收到消息时实例化新对象。例如:

在background.js中:

...
function url(href, anchorText, altText, linksOut) {
    this.href = href;
    this.anchorText = anchorText;
    this.altText = altText;
    this.linksOut = linksOut;
}
...
chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {
    var genericObj = msg.urlObj;
    var urlObjClone = new url(genericObj.href, genericObj.anchorText,
                              genericObj.altText, genericObj.linksOut);
});
...


(在任何情况下,更具体地说明您最终要实现的目标,可能会产生更好的建议。)

谢谢您的回答。看来B是我最好的选择。我问的主要是出于教育目的,因为一个物体会像那样失去它的身份似乎是不对的,所以我想也许有一种方法可以让它保留我不知道的东西。此外,它还可以更容易地识别控制台中的内容。不管怎样,谢谢,干杯。
...
function url(href, anchorText, altText, linksOut) {
    this.href = href;
    this.anchorText = anchorText;
    this.altText = altText;
    this.linksOut = linksOut;
}
...
chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {
    var genericObj = msg.urlObj;
    var urlObjClone = new url(genericObj.href, genericObj.anchorText,
                              genericObj.altText, genericObj.linksOut);
});
...