虽然js不像其他后端语言那样内置对名称空间的支持,但是也可以通过类似的效果和闭包来实现名称空间。 首先,给出六种简单实现方式的细节,如下:单个全局变量varmyapp =(function(){ function method 1(){//...},返回{//...方法1:方法1 };})();2.前缀命名空间var myApp _ property a = { };var myApp _ property b = { };Var app _ method1 = function () {//...} 3.对象文字表示var Myapp = {/*...*/模型:{},视图:{},集合:{ } };Myapp.method1 = function () {//..} 4.嵌套命名空间var myApp = myApp | | { };myapp . models = myapp . models | | { };myapp . models . model util = myapp . models . model util | | { };5.函数的自执行(立即使用表达式)(函数(命名空间){namespace.propertya = "you ... ";namespace . method 1 = function(){//...} })(window . myapp = window . myapp | | { });6.命名空间注入var myApp = myApp | | { };myapp . utils = myapp . utils | | { };(function(){ this.propertyA = "you ... ";this.method1 = function() {//...}}).应用(myapp . utils);让我们把重点放在第四个,那么第四个能像其他语言一样优雅,因为它意味着名称空间吗?答案是:可以。 我在这里写一个方法为读者提供晚餐,如下:var utils = (function (window,undefined) {/*...其余的使用函数...*/var namespace = function () {var A,V,X,O,D,I,J,Len1,Len2a =参数;len1 = a .长度;//支持多参数,比如(I = 0)的两个参数(A.B.C .,d . e .);i < len1i++){ d = a[i]。分裂(\。⑦。);//分解成数组,比如[a,b,c]o = window[d[0]]= window[d[0]]| | { };//确保是一个对象。如果是全局的,就用它。如果不是,创建一个新的{ } x = d . slice(1);//取出[b,c]len 2 = x . length;//支持嵌套,对于B,c对于(j = 0;j < len2j++){ v = x[j]o = o[v]= o[v]| | { };// o逐层深入,保证每一层都是对象。如果是B,O变成A.B .如果是C,O最后变成A.B.C.}} return {/*...其余的功能通常会用到...*/namespace: namespace}})(窗口);使用时,示例如下:utils . namespace(≥0 . 001)。myApp.models:);myapp . models . cat = function(config){ if(type of config!= = > 7。对象7。){throw new Error("构造参数对象不能为空");返回;} this . name = config . name;} myapp . models . cat . prototype = { say name:function(){ console . log(" hello!我的名字是“+this . name);}}//Cache作为局部变量方便重复使用var Cat = myapp . models . Cat;var c1 =新卡特彼勒({名称:凯蒂:})C1 . say name();文/丁向明做博客web前台自媒体人,专注web前台开发,专注做用户体验,加我qq/微信交流:6135833 http://dingxiangming.com。