JS命名空間(namespace)

2021-08-02 17:44:33 字數 1448 閱讀 9132

命名空間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庫來整理**結構。

Namespace 命名空間

namespace 命名空間。命名空間是用來解決不同的類和函式擁有相同的名稱的問題。解決了命名衝突的問題。namespace gxg namespace gaoxiaoguang 使用方法 gxg a gxga gaoxiaoguang a gaoxiaoguanga gxg bfunction g...

命名空間namespace

對using namespace std 的解釋 所謂namespace,是指識別符號的各種可見範圍。c 標準程式庫中的所有識別符號都被定義於乙個名為std的namespace中。由於namespace的概念,使用c 標準程式庫的任何識別符號時,可以有三種選擇 1 直接指定識別符號。例如std os...

namespace 命名空間

在討論如何使用命名空間之前,必須了解 php 是如何知道要使用哪乙個命名空間中的元素的。可以將 php 命名空間與檔案系統作乙個簡單的模擬。在檔案系統中訪問乙個檔案有三種方式 相對檔名形式如foo.txt。它會被解析為 currentdirectory foo.txt,其中 currentdirec...