JSM导入以覆盖当前对象

时间:2014-10-02 20:17:37

标签: firefox-addon

我的插件范围内有一个现有对象。它: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'
}

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

3 个答案:

答案 0 :(得分: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'
};

答案 1 :(得分:2)

您可以使用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 :(得分:1)

看起来主要问题是您正在使用第二次导入调用重新定义(替换)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}