JS命名空間

2021-07-27 19:17:26 字數 1448 閱讀 2260

命名空間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...