JSM расширения Firefox и пространство имен ettiquite
Поэтому в расширениях Firefox рекомендуется, чтобы объекты вашего расширения жили в подобъектах, таких как com.contoso.myExtension . Таким образом, вы не помещаете никаких объектов в глобальное пространство имен, а расширения обычно остаются вне досягаемости друг друга. (По крайней мере, в обычном окне browser.xul)
Но из того, что я понимаю о модулях кода Javascript (JSM), заключается в том, что, хотя сам модуль работает в отдельном пространстве имен, экспортируемые им символы окажутся в глобальном пространстве имен любого кода, импортирующего его. Кроме того, невозможно, чтобы расширение было "хорошим" и пыталось только создавать подобъекты; эти экспортированные символы будут просто уничтожать любые существующие глобальные переменные. Также вы не можете экспортировать такие символы, как com.contoso.myExtension . Это всего лишь простая глобальная переменная.
Так какой протокол для игры хорошо при использовании JSM? Просто сделайте действительно длинные имена переменных и надейтесь, что они не столкнутся?
1 ответ
Во-первых, я не видел жесткого настоящего стандарта того, как справиться с этим. Но мы определенно можем сделать намного лучше, чем просто длинные имена переменных...
Вы правы относительно модулей кода Javascript, живущих в отдельном пространстве имен (так сказать), однако, когда вы импортируете их, вам не нужно импортировать их в глобальное пространство имен. Если вы посмотрите документацию Components.utils.import, вы увидите, что вы можете импортировать в определенную область. То есть вам вообще не нужно загрязнять глобальное пространство имен.
Вы можете собрать свои модули в myExtension
Пространство имен.
var myExtension = {};
Components.utils.import("resource://.../module.jsm", myExtension);
И оборачивая это в самовыполняющуюся функцию, вы не пропустите ни одной переменной в глобальное пространство имен, даже myExtension
!
(function(){
var myExtension = {};
Components.utils.import("resource://.../module.jsm", myExtension);
})();