2012-12-02 68 views
3

這是我發現自己使用和調整多年的js模式。有沒有人認識到這種JavaScript設計模式?

事情是,我經歷了一些實驗後陷入了它,我很想知道這種類型的模式是否有名稱。我瀏覽了很多設計模式,但沒有發現類似的東西(或者很簡單,特別是對於模塊化類型模式)。

var FOO = (function ($) { 
    var privateFuncA = function() { 
     ... 
    },   
    privateFuncB = function() { 
     ... 
    }, 
    self = { 
     init: function() { 
      privateFuncA(); // Call a private func 
      self.publicFunc(); // Call a public func 
     }, 
     publicFunc: function() { 
      ... 
     } 
    }; 
    return self; 
}(jQuery)); 

$(function() { 
    // Initialise FOO 
    FOO.init(); 
}); 

想法是保留所有命名空間,並允許僞公共/私人funcs。

如果我需要去模塊化I將擴展底座Foo對象:如果你想從外面就可以調用publicFunc在擴展對象

// Extend FOO object 
FOO.Bar = (function ($) { 
    var privateFunc = function() { 
     ... 
    }, 
    self = { 
     publicFunc: function() { 
      ... 
     } 
    }; 
    return self; 
}(jQuery)); 

FOO.Bar.publicFunc() 

有誰知道這種類型的模式是否有名稱,或者這種設計是否存在任何已知問題?

+0

我可能很厚,但與標準[模塊模式]有什麼區別(http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth)(這裏與標準命名空間模式)? –

+0

不,你不是很厚:]我剛剛沒有遇到那篇文章 - 感謝分享,有用的閱讀。 – benpink

回答

3

當然。它只是Christian Hielmann的「Revelling Module」模式的延伸,它本身就是Douglas Crockford模塊模式的延伸。

在我的很多例子在這裏的話,我會用一些非常相似,除了與public_interface更換self,要儘量做到更加明顯,什麼是公共私人private-static

var built_module = (function() { 

    var private_data = "", 
     private_method = function() { /* ... */ }, 

     public_interface = { 
      public_method : function() { /* ... */ }, 
      public_data 
     }; 

    return public_interface; 

}()); 

和作爲構造:

var built_constructor = (function (env_params) { 

    var static_data = "", 
     static_method = function() { /* ... */ }, 

     public_constructor = function (params) { 
      var private_data = "", 
       private_method = function (params) { /* ... */ }, 

       public_interface = { 
        public_method : function() { /* ... */ }, 
        public_data 
       }; 

      return public_interface; 
     }; 

    return public_constructor; 
}(envArgs)); 


var myInstance = built_constructor(myArgs); 

「靜態」數據/性能在外部閉合的,因此,所有的內封閉的內VARS /函數具有訪問它們,而「靜態」方法無法訪問任何實例方法/數據,而無需將參數傳遞到函數中。

您可以從這裏以任何方式擴展它 - 刪除返回值,而是將public_interface指定爲對象的屬性,或默認爲window(用於名稱間距)。

+0

超級。感謝您的快速歷史和例子。很有用。 – benpink

+0

@benpink不用擔心。我想我應該在這裏提到尼古拉斯扎卡斯。他寫了幾本好書,但我發現他爲我完成的最好的事情,個人是一個關於大型JS架構的討論。他實際上以一種非常乾淨,獨立的方式創建了一個沙盒環境。當然,爲了達到目標,您可能需要了解/實現承諾/延期異步模式和/或pub-sub/moderator/observer/emitter消息傳遞系統。值得一看,YouTube上至少有3個不同的版本。 – Norguard