最終更新:2021-02-25 (木) 23:36:35 (1148d)  

JavaScript/モジュールパターン
Top / JavaScript / モジュールパターン

https://addyosmani.com/resources/essentialjsdesignpatterns/book/#modulepatternjavascript

var myNamespace = (function () {
  var myPrivateVar, myPrivateMethod;
  // A private counter variable
  myPrivateVar = 0;
  // A private function which logs any arguments
  myPrivateMethod = function( foo ) {
      console.log( foo );
  };
  return {
    // A public variable
    myPublicVar: "foo",
    // A public function utilizing privates
    myPublicFunction: function( bar ) {
      // Increment our private counter
      myPrivateVar++;
      // Call our private method using bar
      myPrivateMethod( bar );
    }
  };
})();

派生形

Import mixins

  • jQueryとかUnderscore.jsなどのグローバル変数を渡す
    // Global module
    var myModule = (function ( jQ, _ ) {
        function privateMethod1(){
            jQ(".container").html("test");
        }
        function privateMethod2(){
          console.log( _.min([10, 5, 100, 2, 1000]) );
        }
        return{
            publicMethod: function(){
                privateMethod1();
            }
        };
    // Pull in jQuery and Underscore
    })( jQuery, _ );

exports

  • 公開するものをmoduleとして定義してreturn
    // Global module
    var myModule = (function () {
      // Module object
      var module = {},
        privateVariable = "Hello World";
      function privateMethod() {
        // ...
      }
      module.publicProperty = "Foobar";
      module.publicMethod = function () {
        console.log( privateVariable );
      };
      return module;
    })();

Revealing Module Pattern

  • ちょっと改良版
    var myRevealingModule = (function () {
            var privateVar = "Ben Cherry",
                publicVar = "Hey there!";
            function privateFunction() {
                console.log( "Name:" + privateVar );
            }
            function publicSetName( strName ) {
                privateVar = strName;
            }
            function publicGetName() {
                privateFunction();
            }
            // Reveal public pointers to
            // private functions and properties
            return {
                setName: publicSetName,
                greeting: publicVar,
                getName: publicGetName
            };
        })();
    myRevealingModule.setName( "Paul Kinlan" );

参考