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