【问题标题】:JSM Import to override current objectJSM 导入以覆盖当前对象
【发布时间】:2019-03-18 03:52:27
【问题描述】:

我的插件范围中有一个现有对象。其:var ostypes = {}

它是通过导入这个 jsm 创建的:Cu.import('chrome://myaddon/content/modules/ostypes_generic.jsm');

这个文件的内容是:

var ostypes = {
  flock_overide: 'blah',
  no_override: 'blah'
};

所以现在我想导入这个 jsm:Cu.import('chrome://myaddon/content/modules/ostypes_mac.jsm');

哪个有这个:

var ostypes = {
  flock_overide: 'blah_replaced'
};

在我的插件范围内,我想先导入 generic.jsm,然后再导入 mac.jsm,最后我希望 ostypes 看起来像这样:

var ostypes = {
  flock_overide: 'blah_replaced',
  no_override: 'blah'
}

然后我想替换该对象中的一些内容并添加更多内容。

【问题讨论】:

    标签: firefox-addon


    【解决方案1】:

    您可以使用mix function of the core/heritage module from Add-on SDK。

    var { mix } = require('sdk/core/heritage');
    var mixedostypes = mix(genericostypes, macostypes);
    

    见how to access Add-on SDK modules from non Add-on SDK extensions

    【讨论】:

    • 天哪,这也太棒了!将测试并报告:)
    【解决方案2】:

    尝试通过设置应付Components.utils.import(url [, scope]); (Components.utils.import) 将其导入主对象

    let mainObject = {
    
      init: function() { 
        Components.utils.import('chrome://myaddon/../ostypes_generic.jsm', this);
        // code
      },
    
      // code
    }
    

    就个人而言,我还通过将其作为对象的属性将其绑定到主对象

    this.ostypes = {
      flock_overide: 'blah',
      no_override: 'blah'
    };
    

    【讨论】:

      【解决方案3】:

      看起来主要问题是您正在通过第二次导入调用重新定义(替换)ostypes。如果您希望第二次导入仅修改对象,那么对于 /modules/ostypes_mac.jsm 文件,您应该执行以下操作:

      if(typeof ostypes === "undefined") {
          //Not yet defined, so define it.
          var ostypes = {};
      }
      if(ostypes === null || typeof ostypes !== "object") {
          //Already defined, but not an object which we want to add-to/change.
          ostypes = {};
      }
      
      ostypes.flock_overide = 'blah_replaced';
      

      我做了这样的事情,将一个扩展中的多个 JavaScript 模块导入到扩展的一个整体命名空间中。每个 JSM 都会检查并定义扩展的命名空间对象(如果尚未定义)。然后每个人都会创建该名称空间的属性,该属性是包含功能块的对象。功能块的子名称空间如下所示:
      myExtension.Global = {extension's global variables, functions}
      myExtension.Utilities = {extension's utility functions}
      等等

      【讨论】:

      • 这真是太好了,有多个人回答,erik,eros,还有你,这太棒了。谢啦!这真的很酷,我不知道你可以测试 ostypes 是否定义在从 jsm 模块导入的范围内!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-20
      • 2012-07-15
      • 2017-08-12
      • 2016-05-14
      • 2013-09-15
      相关资源
      最近更新 更多