1. 程式人生 > 程式設計 >《javascript設計模式》學習筆記三:Javascript面向物件程式設計單例模式原理與實現方法分析

《javascript設計模式》學習筆記三:Javascript面向物件程式設計單例模式原理與實現方法分析

本文例項講述了Javascript面向物件程式設計單例模式原理與實現方法。分享給大家供大家參考,具體如下:

1.單例模式概述

源自百度百科對於單例模式的定義:

單例模式的意思就是隻有一個例項。單例模式確保某一個類只有一個例項,而且自行例項化並向整個系統提供這個例項。這個類稱為單例類。

在javascript的世界裡,其實沒有嚴格的物件和類定義,“一切皆物件”使得javascript中都是物件,不能像java,c++或者php使用特定的方法返回一個例項來實現,因此對javascript來說,我們要創造的是一個“不能被多次例項化的”物件,也就是說只能例項化一次的物件。

2.簡單單例模式:

只能例項化一次的物件也就可以使用“物件字面量”的定義方式來實現:

var singleton = {
  attribute:'',method:function(){}
}

這樣定義的物件,不能使用new singleton的方式來生成另外的物件(不存在prototype和constructor屬性)。

3.包含私有成員的單例模式:

如果看過之前的我寫的關於類成員的文章,自然的我們就能想到用閉包來實現,既然要用的閉包,那麼一定會用到函式和函式返回值,於是,這樣的單例模式如下:

var singleton = function(){
  var private_attribute = '';
  functioin private_method(){}
  return {
   public_attribute:'',public_method:function(){}
  };
}

還記得匿名函式嗎?通常在使用閉包的時候會使用,改進之後如下:

var singleton = (function(){
  var private_attribute = '';
  functioin private_method(){}
  return {
   public_attribute:'',public_method:function(){}
  };
})();

4.惰性載入(lazy loading,延遲載入)單例模式

2,3中所示單例模式定義方式都是在定義時建立的單例,這樣很浪費記憶體,如何能在使用的時候才建立(lazy loading,更多的用於圖片的延遲載入)呢?所謂惰性載入,也就是先定義,然後在某個地方才建立物件,所以必須要使用函式,我們知道在java或者php中單例模式通常使用一個靜態方法來建立,同理,我們再改進一下閉包形式的定義式:

var singleton = (function(){
  var unique;
  function getinstance(){
    if(!unique){
      unique = construct();
      return unique;
    }
  }
  function construct(){
    var private_member;
    function private_method(){}
    return {//這裡才是真正的單例物件
      public_member:'',public_method:function(){}
    };
})();

這樣呼叫一個單例物件的方法:

singleton.getinstance().publicmethod();

這樣只有在呼叫方法或引用屬性的時候才會真正的建立unique物件,就是使用的時候比較麻煩:)

5.簡單mvc程式碼風格

順便在這裡分享一下我寫js的一個簡單風格,儘管js是一個前臺程式碼,但是就其本身而言,也可以將它的內容分為mvc(model,controller,view,關於mvc的概念請baidu/google),因此在寫一個頁面的js程式碼的時候,我會這麼寫:

//函式封裝在此
var controller = {
  init:function(){}
};
//頁面相關內容封裝在此
var view = {
  table:{},banner:{},foot:{}
};
//資料相關內容封裝在此
var model = {
  table_data:{}
}

在頁面onload的時候呼叫controoler.init();完成初始化工作(資料載入,頁面渲染,事件監聽等),這樣寫的目的是儘量將一些相同的邏輯組織在一起,方便查詢和修改,目前只是一個雛形,希望在看完《javascript設計模式》這本書之後能寫一個輕量級的模型出來^_^

感興趣的朋友可以使用線上HTML/CSS/JavaScript程式碼執行工具:http://tools.jb51.net/code/HtmlJsRun測試上述程式碼執行效果。

更多關於JavaScript相關內容感興趣的讀者可檢視本站專題:《javascript面向物件入門教程》、《JavaScript錯誤與除錯技巧總結》、《JavaScript資料結構與演算法技巧總結》、《JavaScript遍歷演算法與技巧總結》及《JavaScript數學運算用法總結》

希望本文所述對大家JavaScript程式設計有所幫助。