命名空間namespace(某些語言中叫package),是乙個在靜態語言中常見的概念。它可以幫助我們更好地整理**,並可避免命名衝突。
舉乙個簡單的例子,如果有兩個人都叫小明,我們很難區分和引用這兩個人。但如果我們在他們前面加上命名空間,比如:北京的小明和上海的小明,那麼區分起來就容易的多了,也不會因為重名而找錯人了。
遺憾的是,js中並不提供原生的命名空間支援。在js中建立的任何物件都預設是全域性物件。在現代的大規模js開發中,不採用命名空間會造成非常糟糕的命名方式,比如用字首命名函式和變數,導致**醜陋不可讀。當引入第三方庫後,更可能會發生命名覆蓋的情況。
那麼js中該如何解決這個問題呢?你可以等es6的到來,到那時我們就有native命名空間可用了。當下我們還需要一些特殊手段來模擬命名空間的概念。
簡單地說,我們可以建立乙個簡單物件字面量來打包所有的相關函式和變數。這個簡單物件字面量模擬了命名空間的作用。
var mynamespace =
}};
person物件被完整包含到mynamespace這個命名空間中了,使用方法也很簡單:
var p = new
mynamespace.person("ifcode");
p.getname(); // ifcode
如此一來,通過命名空間我們就可以宣告多個person物件了。
我們也可以用是巢狀命名空間,更詳細的歸類物件:
var mynamespace = }},
pet: }}
};
看起來這個模擬的命名空間不錯,但這裡還是有乙個問題。我們這裡使用的是乙個全域性物件,在新增這個「命名空間」的時候,我們有可能覆蓋全域性空間中的同名物件。因此我們需要在宣告命名空間前進行檢查,保證全域性空間的安全:
var mynamespace = mynamespace || {};
若全域性空間中已有同名物件,則不覆蓋該物件;否則建立乙個新的命名空間。採用了這個安全的命名空間後,宣告的方法也需要略作改動:
var mynamespace = mynamespace || {};
mynamespace.person = function
(name)
;mynamespace.person.prototype.getname = function();
// 使用方法
var p = new mynamespace.person("ifcode");
p.getname(); // ifcode
注意在定義命名空間建構函式時,需要將其定義在prototype上,否則新建的例項無法訪問物件的方法。
採用命名空間後,**結構會更加清晰可讀。若不想每次都手動構建命名空間,也可以採用類似requirejs這樣的module pattern庫來整理**結構。
JS命名空間with
眾所周知乙個頁面可能會被很多人開發,那麼這時候就有乙個問題,那就是命名的重複 變數,函式名 所以為了解決這個問題,命名空間就應用而生了。可以先看如下 var org jerry groupb org.groupa.jerry.name那麼此時可以發現,如果要使用某個變數,那麼要層層呼叫,但是這回很麻...
JS命名空間(namespace)
命名空間namespace 某些語言中叫package 是乙個在靜態語言中常見的概念。它可以幫助我們更好地整理 並可避免命名衝突。舉乙個簡單的例子,如果有兩個人都叫小明,我們很難區分和引用這兩個人。但如果我們在他們前面加上命名空間,比如 北京的小明和上海的小明,那麼區分起來就容易的多了,也不會因為重...
JS實現命名空間
作者 zhanhailiang 日期 2012 10 24在新增乙個屬性或者建立乙個命名空間之前,最好是首先檢查它是否已經存在,如下例 if typeof hwsl undefined 或者使用 的短路功能 var hwsl hwsl 但是這些附加的檢查會迅速產生大量重複的 如果想定義hwsl.cu...