2014-10-02 73 views
0

我在我的插件范围中有一个现有的对象。其:var ostypes = {}JSM导入来覆盖当前对象

它是由导入此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' 
}; 

In m Ÿ插件范围我想导入generic.jsm然后mac.jsm,我想ostypes看起来像这样总算:

var ostypes = { 
    flock_overide: 'blah_replaced', 
    no_override: 'blah' 
} 

请帮

然后我想,以取代在该对象出头,并添加更多。

回答

1

尝试将其导入的主要目的通过设置应付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' 
}; 
+0

感谢的人生病测试了这一点! – Noitidart 2014-10-03 07:18:57

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}

+0

这是很高兴有多人回答,erik,eros,和你,这是真棒。谢啦!这真的很酷我不知道你可以测试如果在从jsm模块导入的范围内定义了ostypes! – Noitidart 2014-10-04 04:55:57