cloneInto()

此函数提供了一种安全的方式,可以将特权作用域中定义的`object`复制到特权较低的作用域中,并创建一个结构化克隆。它返回克隆的引用。

js
const clonedObject = cloneInto(myObject, targetWindow);

然后,您可以将克隆体分配给目标作用域中的对象作为`expando`属性,并且在该作用域中运行的脚本可以访问它。

js
targetWindow.foo = clonedObject;

这使得特权代码(例如扩展)能够与特权较低的代码(例如网页脚本)共享`object`。

语法

js
let clonedObject = cloneInto(
  obj,               // object
  targetScope,       // object
  options            // optional object
);

参数

obj

object。要克隆的`object`。

targetScope

object。要将`object`附加到的`object`。

options 可选

object。函数的选项。

cloneFunctions 可选

boolean。是否应克隆`object`的函数。默认为false。克隆的函数具有与使用exportFunction导出的函数相同的语义。请参阅克隆包含函数的对象可选

wrapReflectors 可选

boolean。是否应通过引用传递DOM对象而不是克隆。DOM对象通常不可克隆。默认为false。请参阅克隆包含DOM元素的`object`

返回值

克隆`object`的引用。

示例

此内容脚本创建一个`object`,将其克隆到内容窗口中,并将其作为内容窗口全局的一个属性。

js
// content script
const addonScriptObject = { greeting: "hello from your extension" };
window.addonScriptObject = cloneInto(addonScriptObject, window);

页面中运行的脚本可以访问该`object`。

js
// page script
button.addEventListener("click", () => {
  console.log(window.addonScriptObject.greeting); // "hello from your extension"
});

当然,您不必将克隆体分配给`window`本身;您可以将其分配给目标作用域中的其他`object`。

js
// Content script
window.foo.addonScriptObject = cloneInto(addonScriptObject, window);

您也可以将其传递给页面脚本中定义的函数。假设页面脚本定义了一个如下的函数:

js
// page script
function foo(greeting) {
  console.log(`they said: ${greeting.message}`);
}

内容脚本可以定义一个`object`,克隆它,然后将其传递给该函数。

js
// content script
const addonScriptObject = { message: "hello from your extension" };
window.foo(cloneInto(addonScriptObject, window)); // "they said: hello from your extension"

克隆包含函数的对象

如果待克隆的`object`包含函数,您必须传递{ cloneFunctions: true }标志,否则会出错。如果您传递此标志,则`object`中的函数将使用与exportFunction中使用的相同机制进行克隆。

js
// content script
const addonScriptObject = {
  greetMe() {
    alert("hello from your extension");
  },
};
window.addonScriptObject = cloneInto(addonScriptObject, window, {
  cloneFunctions: true,
});
js
// page script
const test = document.getElementById("test");
test.addEventListener("click", () => {
  window.addonScriptObject.greetMe();
});

克隆包含DOM元素的`object`

默认情况下,如果您要克隆的`object`包含从C++反射的对象(例如DOM元素),则克隆操作会因错误而失败。如果您传递{ wrapReflectors: true }标志,则您克隆的`object`将包含这些对象。

js
// content script
const addonScriptObject = {
  body: window.document.body,
};
window.addonScriptObject = cloneInto(addonScriptObject, window, {
  wrapReflectors: true,
});
js
// page script
const test = document.getElementById("test");
test.addEventListener("click", () => {
  console.log(window.addonScriptObject.body.innerHTML);
});

在目标作用域中访问这些`object`将受到正常的脚本安全检查的约束。

浏览器兼容性