我的插件作用域中有一个现有的对象。its: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'
}然后,我想替换该对象中的一些内容,并添加更多内容。
发布于 2014-10-03 12:15:14
尝试通过设置作用域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'
};发布于 2014-10-03 16:05:15
您可以使用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
发布于 2014-10-04 10:06:37
看起来主要的问题是您正在用您的第二个导入调用重新定义(替换) 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}
等。
https://stackoverflow.com/questions/26168942
复制相似问题