下面這些代碼是browserOverlay.js文件的內(nèi)容,這個腳本文件會在一個界面文件(browserOverlay.xul)中被引用。
// 擴(kuò)展對應(yīng)的唯一全局變量 var myExtension = {}; (function() { // 注冊命名空間 var namespaces = []; this.ns = function(fn) { var ns = {}; namespaces.push(fn, ns); return ns; };
// 初始化 this.initialize = function() { for (var i = 0; i < namespaces.length; i += 2) { var fn = namespaces[i]; var ns = namespaces[i + 1]; fn.apply(ns); } };
// 收尾的清理工作 this.shutdown = function() { window.removeEventListener("load", myExtension.initialize, false); window.removeEventListener("unload", myExtension.shutdown, false); };
// 注冊兩個事件處理程序,維護(hù)擴(kuò)展的生存期 window.addEventListener("load", myExtension.initialize, false); window.addEventListener("unload", myExtension.shutdown, false); }).apply(myExtension);
正如我前文所述,這里只有一個全局對象myExtension。
總結(jié)一下,這個對象要實(shí)現(xiàn)下面幾個方法:
- ns - 注冊一個新的命名空間。
- initialize - 初始化所有的命名空間。
- shutdown - 收尾的清理工作。
當(dāng)然這段代碼也會確保initialize和shutdown方法會在正確的時間被調(diào)用,這也是兩個事件處理程序的作用。
browserOverlay.xul現(xiàn)在看起來可能會是下面這個樣子:
<?xml version="1.0"?> <overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/ there.is.only.xul"> <script src="chrome://namespace/content/browserOverlay.js" type="application/x-javascript"/> <script src="chrome://namespace/content/Module1.js" type="application/x-javascript"/> <script src="chrome://namespace/content/Module2.js" type="application/x-javascript"/> </overlay>
在這里,Module1.js和Module2.js兩個文件是一模一樣的。
myExtension.ns(function() { // TODO: 腳本內(nèi)的全部代碼 });
在不同的模塊間共享數(shù)據(jù)
我們已經(jīng)把所有的腳本置于本地的作用域下,現(xiàn)在讓我們來回答上面提到的第二個問題,就是在不同的命名空間下如何共享函數(shù)和數(shù)據(jù)。基本的思路當(dāng)然是要利用我們唯一的全局對象啦,也就是myExtension。
首先,讓我們先來看看下面這段代碼(都在lib.js文件中)
myExtension.LIB = { // 共享函數(shù)接口 getCurrentURI: function() { return window.location.href; },
// 擴(kuò)展對象的快捷方式 theApp: myExtension,
// XPCOM組件的快捷方式 Cc: Components.classes, Ci: Components.interfaces,
// 等等。。。 };
你可以注意到,這段代碼在全局的myExtension對象下建立了一個新的LIB屬性,這個屬性定義了一個函數(shù)庫,是要在擴(kuò)展所有的模塊中共享的。你應(yīng)該在Java的包結(jié)構(gòu)中看到過相同的做法,所有的命名空間呈樹狀結(jié)構(gòu)分布在一個唯一的對象下面,YUI也是這樣子做的。
lib.js文件也在browserOverlay.xul中引入,緊隨browserOverlay.js的后面。
<?xml version="1.0"?> <overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/ there.is.only.xul"> <script src="chrome://myextension/content/browserOverlay.js" type="application/x-javascript"/> <script src="chrome://myextension/content/lib.js" type="application/x-javascript"/> <script src="chrome://myextension/content/Module1.js" type="application/x-javascript"/> <script src="chrome://myextension/content/Module2.js" type="application/x-javascript"/> </overlay>
讓我們對模塊內(nèi)的腳本也做一些改進(jìn)。
myExtension.ns(function() { with(myExtension.LIB) { // TODO: 腳本內(nèi)的全部代碼 var moduleVariable = "Accessible only from withing this module"; dump("myExtension.Module initialization " + getCurrentURI() + "\n"); } });
通過利用with語句,我們可以方便的訪問所有的庫函數(shù),就像訪問全局變量一樣。
既然我們要訪問全局對象,還可以像下面這樣利用theApp這個快捷方式(尤其是命名空間名字太長的時候)
myExtension.ns(function() { with(myExtension.LIB) { // TODO: 腳本內(nèi)的全部代碼 theApp.sharedValue = "A new shared property"; } });
下面這個圖是從UML的角度來縱觀整個架構(gòu)。
大家可以在 這里 下載本文提到的演示擴(kuò)展。
本文鏈接:http://www.95time.cn/tech/web/2009/6452.asp
出處:七月佑安
責(zé)任編輯:bluehearts
上一頁 Firefox擴(kuò)展的全局命名空間污染 [1] 下一頁
◎進(jìn)入論壇網(wǎng)頁制作、WEB標(biāo)準(zhǔn)化版塊參加討論,我還想發(fā)表評論。
|