Рекомендуется инкапсулировать ваш код в пространство имен, чтобы избежать конфликтов имен. Вот что я всегда делаю в своих аддонах:
if(!org) var org={};
if(!org.janek) org.janek={};
org.janek.Addon = function() {
var pub = {};
var self = this;
pub.init = function() {
//
// Initialize addon, setup listeners, ...
//
}
...
self.thisIsAPrivateMethod = function(arg) {
// method that's only visible inside org.janek.Addon
}
return pub;
}();
// Init addin after window loaded
window.addEventListener("load",
org.janek.Addon.init,
false);
Сначала я создаю свое собственное пространство имен org.janek, чтобы убедиться, что оно еще не существует. Затем я добавляю объект Addon, который будет содержать код для моего аддона.
Обратите внимание на объекты "pub" и "self". Каждый метод, который должен вызываться из других объектов, добавляется в объект pub. Личные методы добавляются к себе.
Если быть более точным, я бы изменил quickfilter_extension на следующий код (в качестве примера я включил глобальный объект prefManager):
var quickfilter_extension = function() {
var pub = {};
// interface for preferences
pub.prefManager = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
pub.init = function() {
//Initiating the progressListerner
gBrowser.addProgressListener(quickfilter_urlBarListener, Components.interfaces.nsIWebProgress.NOTIFY_STATE_DOCUMENT);
//Load the block list xml form server
quickfilter_quickfilter.request_xml();
},
pub.uninit = function() {
// Remove the progressListerner
gBrowser.removeProgressListener(quickfilter_urlBarListener);
}
return pub;
}();
Код, который использует объект prefManager, теперь должен пройти через объект quickfilter_extension:
redirectToAnotherUrl:function()
{
[ ... omitted ...]
qucikFilterRedirectCount = quickfilter_extension.prefManager.getCharPref("extensions.quickfilter_redirect_count");
[ ... omitted ...]
}
В блоге Yahoo для библиотеки JavaScript YUI есть хорошая статья о паттерне .