JavaScript是一種簡潔明瞭的語言,其中並無在其餘語言中常用的一些特殊語法特徵,好比命名空間(namespace)、模塊(module)、包(package)、私有屬性(private property),以及靜態成員等語法。安全
固然,咱們使用其餘方式來模擬實現上述語法特徵。閉包
1 /** 2 * 1.命名空間模式 3 * 1>命名名稱的選取:應用程序(QIANGBA)或庫的名稱(TIANLANG)、域名或公司(CYOU)名稱 4 * 2>通用命名空間 5 * 注意名稱覆蓋的問題 6 * //不安全的代碼 7 * var MYAPP = {}; 8 * //更好的代碼 9 * if (typeof MYAPP === 'undefined') { 10 * var MYAPP = {}; 11 * } 12 * //或者用更短的語句 13 * var MYAPP = MYAPP || {}; 14 * 由此,咱們沒必要太過擔憂加載順序了。 15 * 2.聲明依賴關係 16 * 3.私有屬性和方法 17 * 1>私有成員(函數字面量來實現私有性) 18 * function Gadget() { //僅僅是一個包含私有數據的函數,咱們能夠用一個當即執行的匿名函數來替換之。 19 * //私有成員 20 * var name = 'iPod'; 21 * //公有函數 22 * this.getName = function () { //特權函數 23 * return name; 24 * } 25 * } 26 * 2>特權方法 27 * 3>私有性失效 28 * 4>對象字面量以及私有性 29 * var myobj = (function () { 30 * //私有成員 31 * var name = 'oh my baby'; 32 * //實現公有部分 33 * return { 34 * getName: function () { 35 * return name; 36 * } 37 * } 38 * })(); 39 * myobj.getName(); //oh my baby 40 * 5>原型和私有性 41 * 爲了不復制工做以及節省內存,能夠將經常使用屬性和方法添加到構造函數的prototype屬性中。 42 * 6>將私有方法揭示爲公共方法 43 * var myarray; 44 (function () { 45 var astr = '[Object Array]', 46 toString = Object.prototype.toString; 47 function isArray(a) { 48 return toString.call(a) === atr; 49 } 50 function indexOf(haystack, needle) { 51 var i = 0, 52 max = haystack.length; 53 for (; i < max; i++) { 54 if (haystack[i] === needle) { 55 return i; 56 } 57 } 58 return -1; 59 } 60 myarray = { 61 isArray: isArray, 62 indexOf: indexOf, //當公共indexOf方法發生了意外(如myarray.indexOf = null), 63 //但私有indexOf()方法仍然是安全的,此時inArray將繼續正常運行 64 inArray: indexOf 65 } 66 })(); 67 */ 68 69 70 /** 71 * 4.模塊模式 72 * 1>命名空間 73 * 2>即時函數 74 * 3>私有和特權成員 75 * 4>聲明依賴 76 * 77 * ----------- (a)揭示模塊模式 ------------- 78 * //(1)創建一個命名空間 79 MYAPP.namespace('MYAPP.utilities.array'); 80 //(2)定義模塊 81 MYAPP.utilities.array = (function () { //用即時函數進行包圍 82 //聲明依賴 83 var uobj = MYAPP.utilities.object, 84 ulang = MYAPP.utilities.lang, 85 86 //私有屬性 87 array_string = '[Object Array]', 88 ops = Object.prototype.toString, 89 90 //私有方法 91 isArray = function (a) { 92 return opts.call(a) === array_string; 93 }; 94 inArray = function (haystack, needle) { 95 var i = 0, 96 max = haystack.length; 97 for (; i < max; i++) { 98 if (haystack[i] === needle) { 99 return i; 100 } 101 } 102 return -1; 103 }; 104 105 //揭示公有API 106 return { 107 isArray: isArray, 108 indexOf: inArray 109 }; 110 111 })(); 112 113 ----------- (b)建立構造函數的模塊 ------------- 114 MYAPP.namespace('MYAPP.utilities.array'); 115 MYAPP.utilities.array = (function () { //用即時函數進行包圍 116 //聲明依賴 117 var uobj = MYAPP.utilities.object, 118 ulang = MYAPP.utilities.lang, 119 120 //私有屬性 121 Constr; 122 123 //公有API 124 Constr = function (o) { 125 this.elems = this.toArray(o); 126 }; 127 128 Constr.prototype = { 129 constructor: MYAPP.utilities.Array, 130 version: '2.0', 131 toArray: function (obj) { 132 for (var i = 0, a = [], len = obj.length; i < len; i++) { 133 a[i] = obj[i]; 134 } 135 return a; 136 } 137 }; 138 139 //返回要分配給新命名空間的構造函數 140 return Constr; 141 })(); 142 143 ----------- (c)將全局變量導入到模塊中 ----------- 144 MYAPP.utilities.module = (function (app, global) { 145 //引用全局變量對象 146 //引用如今被轉換成局部變量的全局應用程序命名空間對象(app) 147 })(MYAPP, this); 148 */ 149 150 /** 151 * 5.靜態成員 152 * 1>公有靜態成員 153 * //構造函數 154 var Gadget = function () {}; 155 //靜態方法 156 Gadget.isShiny = function () { 157 return 'you bet'; 158 }; 159 //向該原型中添加普通方法 160 Gadget.prototype.setPrice = function (price) { 161 this.price = price; 162 }; 163 2>私有靜態成員(普通閉包) 164 */ 165 166 /** 167 * 6.鏈模式 168 * return this;實現 169 */ 170 171 /** 172 * 7.method()方法 173 */