我的插件范围内有一个现有对象。它: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'
}
然后我想替换该对象中的一些内容并添加更多内容。
答案 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}
等