<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      代碼改變世界

      深入理解JavaScript系列(47):對象創建模式(上篇)

      2012-04-25 08:49  湯姆大叔  閱讀(16112)  評論(12)    收藏  舉報

      介紹

      本篇主要是介紹創建對象方面的模式,利用各種技巧可以極大地避免了錯誤或者可以編寫出非常精簡的代碼。

      模式1:命名空間(namespace)

      命名空間可以減少全局命名所需的數量,避免命名沖突或過度。一般我們在進行對象層級定義的時候,經常是這樣的:

      var app = app || {};
      app.moduleA = app.moduleA || {};
      app.moduleA.subModule = app.moduleA.subModule || {};
      app.moduleA.subModule.MethodA = function () {
          console.log("print A");
      };
      app.moduleA.subModule.MethodB = function () {
          console.log("print B");
      };

      如果層級很多的話,那就要一直這樣繼續下去,很是混亂。namespace模式就是為了解決這個問題而存在的,我們看代碼:

      // 不安全,可能會覆蓋已有的MYAPP對象
      var MYAPP = {};
      // 還好
      if (typeof MYAPP === "undefined") {
          var MYAPP = {};
      }
      // 更簡潔的方式
      var MYAPP = MYAPP || {};
      
      //定義通用方法
      MYAPP.namespace = function (ns_string) {
          var parts = ns_string.split('.'),
              parent = MYAPP,
              i;
      
          // 默認如果第一個節點是MYAPP的話,就忽略掉,比如MYAPP.ModuleA
          if (parts[0] === "MYAPP") {
              parts = parts.slice(1);
          }
      
          for (i = 0; i < parts.length; i += 1) {
              // 如果屬性不存在,就創建
              if (typeof parent[parts[i]] === "undefined") {
                  parent[parts[i]] = {};
              }
              parent = parent[parts[i]];
          }
          return parent;
      };

      調用代碼,非常簡單:

      // 通過namespace以后,可以將返回值賦給一個局部變量
      var module2 = MYAPP.namespace('MYAPP.modules.module2');
      console.log(module2 === MYAPP.modules.module2); // true
      
      // 跳過MYAPP
      MYAPP.namespace('modules.module51');
      
      // 非常長的名字
      MYAPP.namespace('once.upon.a.time.there.was.this.long.nested.property');

      模式2:定義依賴

      有時候你的一個模塊或者函數可能要引用第三方的一些模塊或者工具,這時候最好將這些依賴模塊在剛開始的時候就定義好,以便以后可以很方便地替換掉。

      var myFunction = function () {
          // 依賴模塊
          var event = YAHOO.util.Event,
              dom = YAHOO.util.dom;
      
          // 其它函數后面的代碼里使用局部變量event和dom
      };

      模式3:私有屬性和私有方法

      JavaScript本書不提供特定的語法來支持私有屬性和私有方法,但是我們可以通過閉包來實現,代碼如下:

      function Gadget() {
          // 私有對象
          var name = 'iPod';
          // 公有函數
          this.getName = function () {
              return name;
          };
      }
      var toy = new Gadget();
      
      // name未定義,是私有的
      console.log(toy.name); // undefined
      
      // 公有方法訪問name
      console.log(toy.getName()); // "iPod"
      
      var myobj; // 通過自執行函數給myobj賦值
      (function () {
          // 自由對象
          var name = "my, oh my";
      
          // 實現了公有部分,所以沒有var
          myobj = {
              // 授權方法
              getName: function () {
                  return name;
              }
          };
      } ());

      模式4:Revelation模式

      也是關于隱藏私有方法的模式,和《深入理解JavaScript系列(3):全面解析Module模式》里的Module模式有點類似,但是不是return的方式,而是在外部先聲明一個變量,然后在內部給變量賦值公有方法。代碼如下:

      var myarray;
      
      (function () {
          var astr = "[object Array]",
              toString = Object.prototype.toString;
      
          function isArray(a) {
              return toString.call(a) === astr;
          }
      
          function indexOf(haystack, needle) {
              var i = 0,
                  max = haystack.length;
              for (; i < max; i += 1) {
                  if (haystack[i] === needle) {
                      return i;
                  }
              }
              return -1;
          }
      
          //通過賦值的方式,將上面所有的細節都隱藏了
          myarray = {
              isArray: isArray,
              indexOf: indexOf,
              inArray: indexOf
          };
      } ());
      
      //測試代碼
      console.log(myarray.isArray([1, 2])); // true
      console.log(myarray.isArray({ 0: 1 })); // false
      console.log(myarray.indexOf(["a", "b", "z"], "z")); // 2
      console.log(myarray.inArray(["a", "b", "z"], "z")); // 2
      
      myarray.indexOf = null;
      console.log(myarray.inArray(["a", "b", "z"], "z")); // 2

      模式5:鏈模式

      鏈模式可以你連續可以調用一個對象的方法,比如obj.add(1).remove(2).delete(4).add(2)這樣的形式,其實現思路非常簡單,就是將this原樣返回。代碼如下:

      var obj = {
          value: 1,
          increment: function () {
              this.value += 1;
              return this;
          },
          add: function (v) {
              this.value += v;
              return this;
          },
          shout: function () {
              console.log(this.value);
          }
      };
      
      // 鏈方法調用
      obj.increment().add(3).shout(); // 5
      
      // 也可以單獨一個一個調用
      obj.increment();
      obj.add(3);
      obj.shout();

      總結

      本篇是對象創建模式的上篇,敬請期待明天的下篇。

      參考:http://shichuan.github.com/javascript-patterns/#object-creation-patterns

      同步與推薦

      本文已同步至目錄索引:深入理解JavaScript系列

      深入理解JavaScript系列文章,包括了原創,翻譯,轉載等各類型的文章,如果對你有用,請推薦支持一把,給大叔寫作的動力。

      主站蜘蛛池模板: 国产永久免费高清在线| 99网友自拍视频在线| 丰满的女邻居2| 久久夜色撩人精品国产av| 亚洲人妻精品一区二区| 精品人伦一区二区三区蜜桃免费| 国产免费网站看v片元遮挡| 亚洲AV蜜桃永久无码精品 | 久久96热在精品国产高清| 亚洲av乱码一区二区| 亚洲欧美电影在线一区二区| 色综合色狠狠天天综合网| 99久久精品国产一区二区蜜芽| 峡江县| 成人一区二区人妻不卡视频| 亚洲欧洲日韩国内精品| 亚洲人成网站77777在线观看| 色悠悠国产精品免费观看| 欧美黑人性暴力猛交在线视频| 国产欧美亚洲精品第一页在线| 亚洲色www成人永久网址| 免费看成人aa片无码视频吃奶| 亚洲精品一区国产欧美| 偷窥国产亚洲免费视频| 无码国模国产在线观看免费| 亚洲男人天堂东京热加勒比| 高清国产精品人妻一区二区| 粉嫩一区二区三区国产精品| 亚洲欧美成人aⅴ在线| 国产极品美女高潮抽搐免费网站| 精品国产免费一区二区三区香蕉| 久久精品国产久精国产一老狼| 美女黄18以下禁止观看| 日韩免费无码一区二区三区| 丁香花成人电影| 一区二区不卡国产精品| 色欲国产精品一区成人精品| 日韩午夜福利视频在线观看| 1区2区3区高清视频| 蜜臀av午夜精品福利| 免费视频欧美无人区码|