Firefox addon JSM导入以覆盖当前对象

Firefox addon JSM导入以覆盖当前对象,firefox-addon,Firefox Addon,我的加载项范围中有一个现有对象。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/os

我的加载项范围中有一个现有对象。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'
}

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

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

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

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

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

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

this.ostypes = {
  flock_overide: 'blah',
  no_override: 'blah'
};
您可以使用

var{mix}=require('sdk/core/heritage');
var mixedostypes=mix(genericostypes,macostypes);
请参见,您可以使用

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

请参见

主要问题似乎是您正在使用第二次导入调用重新定义(替换)
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={扩展的全局变量、函数}

myExtension.Utilities={extension的实用函数}


等等。

看起来主要问题是您正在用第二次导入调用重新定义(替换)
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={扩展的全局变量、函数}

myExtension.Utilities={extension的实用函数}


等等。

天哪,这也太棒了!将测试并报告:)天哪,这也太棒了!将测试并报告:)这真是太好了,有多个人回答,埃里克,厄洛斯,还有你,这太棒了。谢谢你,伙计!这真的很酷,我不知道您可以测试OSTYPE是否定义在jsm模块导入的范围内!能有多个人回答真是太好了,埃里克,厄洛斯,还有你,这太棒了。谢谢你,伙计!这真的很酷,我不知道您可以测试OSTYPE是否定义在jsm模块导入的范围内!