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

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

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

      深入理解JavaScript系列(25):設計模式之單例模式

      2012-02-20 08:39  湯姆大叔  閱讀(79592)  評論(41)    收藏  舉報

      介紹

      從本章開始,我們會逐步介紹在JavaScript里使用的各種設計模式實現,在這里我不會過多地介紹模式本身的理論,而只會關注實現。OK,正式開始。

      在傳統開發工程師眼里,單例就是保證一個類只有一個實例,實現的方法一般是先判斷實例存在與否,如果存在直接返回,如果不存在就創建了再返回,這就確保了一個類只有一個實例對象。在JavaScript里,單例作為一個命名空間提供者,從全局命名空間里提供一個唯一的訪問點來訪問該對象。

      正文

      在JavaScript里,實現單例的方式有很多種,其中最簡單的一個方式是使用對象字面量的方法,其字面量里可以包含大量的屬性和方法:

      var mySingleton = {
      property1: "something",
      property2: "something else",
      method1: function () {
      console.log('hello world');
      }
      };

      如果以后要擴展該對象,你可以添加自己的私有成員和方法,然后使用閉包在其內部封裝這些變量和函數聲明。只暴露你想暴露的public成員和方法,樣例代碼如下:

      var mySingleton = function () {

      /* 這里聲明私有變量和方法 */
      var privateVariable = 'something private';
      function showPrivate() {
      console.log(privateVariable);
      }

      /* 公有變量和方法(可以訪問私有變量和方法) */
      return {
      publicMethod: function () {
      showPrivate();
      },
      publicVar: 'the public can see this!'
      };
      };

      var single = mySingleton();
      single.publicMethod(); // 輸出 'something private'
      console.log(single.publicVar); // 輸出 'the public can see this!'

      上面的代碼很不錯了,但如果我們想做到只有在使用的時候才初始化,那該如何做呢?為了節約資源的目的,我們可以另外一個構造函數里來初始化這些代碼,如下:

      var Singleton = (function () {
      var instantiated;
      function init() {
      /*這里定義單例代碼*/
      return {
      publicMethod: function () {
      console.log('hello world');
      },
      publicProperty: 'test'
      };
      }

      return {
      getInstance: function () {
      if (!instantiated) {
      instantiated = init();
      }
      return instantiated;
      }
      };
      })();

      /*調用公有的方法來獲取實例:*/
      Singleton.getInstance().publicMethod();

      知道了單例如何實現了,但單例用在什么樣的場景比較好呢?其實單例一般是用在系統間各種模式的通信協調上,下面的代碼是一個單例的最佳實踐:

      var SingletonTester = (function () {

      //參數:傳遞給單例的一個參數集合
      function Singleton(args) {

      //設置args變量為接收的參數或者為空(如果沒有提供的話)
      var args = args || {};
      //設置name參數
      this.name = 'SingletonTester';
      //設置pointX的值
      this.pointX = args.pointX || 6; //從接收的參數里獲取,或者設置為默認值
      //設置pointY的值
      this.pointY = args.pointY || 10;

      }

      //實例容器
      var instance;

      var _static = {
      name: 'SingletonTester',

      //獲取實例的方法
      //返回Singleton的實例
      getInstance: function (args) {
      if (instance === undefined) {
      instance = new Singleton(args);
      }
      return instance;
      }
      };
      return _static;
      })();

      var singletonTest = SingletonTester.getInstance({ pointX: 5 });
      console.log(singletonTest.pointX); // 輸出 5

      其它實現方式

      方法1:

      function Universe() {

      // 判斷是否存在實例
      if (typeof Universe.instance === 'object') {
      return Universe.instance;
      }

      // 其它內容
      this.start_time = 0;
      this.bang = "Big";

      // 緩存
      Universe.instance = this;

      // 隱式返回this
      }

      // 測試
      var uni = new Universe();
      var uni2 = new Universe();
      console.log(uni === uni2); // true

      方法2:

      function Universe() {

      // 緩存的實例
      var instance = this;

      // 其它內容
      this.start_time = 0;
      this.bang = "Big";

      // 重寫構造函數
      Universe = function () {
      return instance;
      };
      }

      // 測試
      var uni = new Universe();
      var uni2 = new Universe();
      uni.bang = "123";
      console.log(uni === uni2); // true
      console.log(uni2.bang); // 123

      方法3:

      function Universe() {

      // 緩存實例
      var instance;

      // 重新構造函數
      Universe = function Universe() {
      return instance;
      };

      // 后期處理原型屬性
      Universe.prototype = this;

      // 實例
      instance = new Universe();

      // 重設構造函數指針
      instance.constructor = Universe;

      // 其它功能
      instance.start_time = 0;
      instance.bang = "Big";

      return instance;
      }


      // 測試
      var uni = new Universe();
      var uni2 = new Universe();
      console.log(uni === uni2); // true

      // 添加原型屬性
      Universe.prototype.nothing = true;

      var uni = new Universe();

      Universe.prototype.everything = true;

      var uni2 = new Universe();

      console.log(uni.nothing); // true
      console.log(uni2.nothing); // true
      console.log(uni.everything); // true
      console.log(uni2.everything); // true
      console.log(uni.constructor === Universe); // true

      方式4:

      var Universe;

      (function () {

      var instance;

      Universe = function Universe() {

      if (instance) {
      return instance;
      }

      instance = this;

      // 其它內容
      this.start_time = 0;
      this.bang = "Big";
      };
      } ());

      //測試代碼
      var a = new Universe();
      var b = new Universe();
      alert(a === b); // true
      a.bang = "123";
      alert(b.bang); // 123

      參考資料

      https://github.com/shichuan/javascript-patterns/blob/master/design-patterns/singleton.html

      http://www.addyosmani.com/resources/essentialjsdesignpatterns/book/#singletonpatternjavascript

      同步與推薦

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

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

      主站蜘蛛池模板: 日韩在线不卡免费视频一区| 暖暖 免费 高清 日本 在线观看5| 精品伊人久久久香线蕉| 亚洲精品日韩精品久久| 亚洲跨种族黑人xxxxx| 在线播放国产精品一品道| 天天影视色香欲综合久久| 亚洲最大福利视频网| 蜜桃视频网站| 激情人妻自拍中文夜夜嗨 | 国内外成人综合免费视频| 72种姿势欧美久久久久大黄蕉| 国产精品三级中文字幕| 成av免费大片黄在线观看 | 艳妇臀荡乳欲伦交换h在线观看| 成人av午夜在线观看| 亚洲第一国产综合| 国产高清在线男人的天堂| 欧美黑人又粗又大久久久| 伦理片午夜视频在线观看| 被拉到野外强要好爽| 日日橹狠狠爱欧美视频| 成人无套少萝内射中出| 黄又色又污又爽又高潮| 亚洲伊人久久综合成人| 国产一级毛片高清完整视频版| 玩弄丰满少妇人妻视频| 在线视频中文字幕二区| 亚洲中少妇久久中文字幕| 无码人妻aⅴ一区二区三区蜜桃| 久久精品国产精品亚洲蜜月| 日韩精品一区二区都可以| 国产成人无码免费视频在线| 阳谷县| 亚洲国产大片永久免费看| 99久久精品国产一区二区蜜芽| 亚洲精品国产自在现线最新| 久天啪天天久久99久孕妇| 国产二区三区不卡免费| 日韩人妖精品一区二区av| 97国产成人无码精品久久久|