2014-10-02 39 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