【讀書筆記】讀《JavaScript模式》 - 對象建立模式

  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  */
相關文章
相關標籤/搜索