Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.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 Firefox加载项:切换作用域后功能不可用_Javascript_Firefox_Firefox Addon - Fatal编程技术网

Javascript Firefox加载项:切换作用域后功能不可用

Javascript Firefox加载项:切换作用域后功能不可用,javascript,firefox,firefox-addon,Javascript,Firefox,Firefox Addon,从Firefox 36开始,功能。\uuuuu exposedProps\uuuuu不可用。相反,如果想要公开内容脚本中使用的chrome JS对象,则必须使用Components.utils.cloneInto,目标范围为browser.contentWindow.wrappedJSObject 如果未启用cloneFunctions标志,则仅克隆非函数的属性。旋转标志也会克隆函数,但不会克隆通过函数.prototype路径定义的函数。对于这些函数,必须通过Components.utils.e

从Firefox 36开始,
功能。\uuuuu exposedProps\uuuuu
不可用。相反,如果想要公开内容脚本中使用的chrome JS对象,则必须使用
Components.utils.cloneInto
,目标范围为
browser.contentWindow.wrappedJSObject

如果未启用
cloneFunctions
标志,则仅克隆非函数的属性。旋转标志也会克隆函数,但不会克隆通过
函数.prototype
路径定义的函数。对于这些函数,必须通过
Components.utils.exportTo
将其导出,目标范围为公开对象

说到我面临的问题。(由于我无法用语言表达,我添加了一个MWE)

Chrome-end-JS:

function Foo(){
    this._nFunc = "something";
    this._func  = function(){/*do something*/};
}

Foo.prototype.Bar = function(){
    this._func();
}

Foo.prototype.FooBar = function(){
    this._nFunc = "somthing else";
}

var myFoo = new Foo();
var targetScope  = browser.contentWindow.wrappedJSObject;

targetScope.myExposedObject = Components.utils.cloneInto(myFoo, targetScope, {cloneFunctions:true});
Components.utils.exportFunction(myFoo.Bar, targetScope.myExposedObject , {defineAs:"Bar"});
Components.utils.exportFunction(myFoo.FooBar, targetScope.myExposedObject , {defineAs:"FooBar"});
window.myExposedObject.FooBar(); // works
window.myExposedObject._func();  // works
window.myExposedObject.Bar()     // error this._func is undefined
内容端JS:

function Foo(){
    this._nFunc = "something";
    this._func  = function(){/*do something*/};
}

Foo.prototype.Bar = function(){
    this._func();
}

Foo.prototype.FooBar = function(){
    this._nFunc = "somthing else";
}

var myFoo = new Foo();
var targetScope  = browser.contentWindow.wrappedJSObject;

targetScope.myExposedObject = Components.utils.cloneInto(myFoo, targetScope, {cloneFunctions:true});
Components.utils.exportFunction(myFoo.Bar, targetScope.myExposedObject , {defineAs:"Bar"});
Components.utils.exportFunction(myFoo.FooBar, targetScope.myExposedObject , {defineAs:"FooBar"});
window.myExposedObject.FooBar(); // works
window.myExposedObject._func();  // works
window.myExposedObject.Bar()     // error this._func is undefined
在记录函数
Bar()
接收的
这个
范围后,我们得到
\u func:(void 0)
,而
\u nFunc
被正确记录

问题:

  • 我有没有遗漏什么,或者这是Firefox的一个限制?如果这是一个限制,请建议解决该限制的可能方法
  • 起初,我认为
    Bar()
    不知何故无法访问调用对象的作用域,我尝试将作用域作为参数提供给它,即
    Foo.prototype.Bar=function(scope){scope.\u func()}
    window.myExposedObject.Bar(window.myExposedObject)。有趣的是,在日志记录时,范围对象也变成了
    (void 0)
    。为什么呢我确信我在这里遗漏了一些东西。我所期望的是,暴露的对象将映射到原始对象,在将暴露的对象作为参数发送时,chrome end JS将能够获得原始对象

  • 虽然您正试图通过正确组合
    cloneInto
    /
    exportFunction
    和放弃X光片来实现这一点,但我建议您只需使用将类层次结构的非特权部分直接加载到目标上下文中,并且只将最少量的特权函数挂接到原型一旦被创建

    这将减少攻击面,并避免继承带来的麻烦

    此外,这些可能证明是有用的:

    对于所有的流浪者: