JSM导入以覆盖当前对象

问题描述 投票:0回答:3

我的插件范围内有一个现有对象。它的: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
3个回答
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
投票

尝试通过设置cope 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
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.