Javascript Module pattern template. Shows a class with a constructor and public/private methods/properties. Also shows compatibility with CommonJS(eg Node.JS) and AMD (eg requireJS) as well as in a br

/**
 * Created with JetBrains PhpStorm.
 * User: scotty
 * Date: 28/08/2013
 * Time: 19:39
 */
;(function(global){
  "use strict";

  var M = function() {

    // Constructor. arguments are passed
    // from Module() call. this refers to m.
    function init() {
      meth_priv2();
      m.meth_pub2();
    }

    // Empty object, to be populated with
    // public properties and methods.
    var m = {};

    // Private properties. define using var x.
    // closure keeps them private.
    var prop_priv = "private property";

    // public properties. define using m.x.
    m.prop_pub = "public property";

    // private methods. define as var x = function() {}
    // closure keeps them private.
    var meth_priv = function() {
      console.log(prop_priv);
      console.log(m.prop_pub);
    };

    var meth_priv2 = function() {

      // access another priv method
      meth_priv();

      // access a pub method
      m.meth_pub();
    };

    // public methods. define as m.x = function() {}
    // private props/methods accessed via x.
    // public props/methods accessed via m.x
    m.meth_pub = function() {
      console.log(prop_priv);
      console.log(m.prop_pub);
    };

    m.meth_pub2 = function() {

      // access a priv method
      meth_priv();

      // access another pub method
      m.meth_pub();
    };

    // call the constructor
    init.apply(m, arguments);
    return m;
  };

  // determine correct export method depending upon
  // environment that this script was loaded in:
  if (typeof module != 'undefined' && module.exports) {
    module.exports = M; // Node / CommonJS...
  } else if (typeof define === 'function' && define.amd) {
    define('Module', [], M); // or RequireJS / AMD...
  } else {
    global.Module = M; // or browser
  }
global.m=new M();
})(this.window || global);

  使用:

    require(['m'],function(){
         m.meth_pub();
    });

  

 
;(function(global){
  "use strict";
 
  var M = function() {
 
    //构建函数
    function init() {
      meth_priv2();
      m.meth_pub2();
    }
     var m = {};
    //私有变量
    var prop_priv = "private property";
    //公有属性
    m.prop_pub = "public property";
 
    //私有函数
    var meth_priv = function() {
      console.log(prop_priv);
      console.log(m.prop_pub);
    };
 
    var meth_priv2 = function() {
      //访问另一私有方法
      meth_priv();
      //访问公有方法
      m.meth_pub();
    };
 
    //公有方法
    m.meth_pub = function() {
      console.log(prop_priv);//访问私有方法
      console.log(m.prop_pub);//访问公有方法
    };
 
    m.meth_pub2 = function() {
      //访问私有方法
      meth_priv();
      //访问公有方法
      m.meth_pub();
    };
 
    // 调用构建函数
    init.apply(m, arguments);
    return m;
  };
 

  if (typeof module != 'undefined' && module.exports) {
    module.exports = M; // Node / CommonJS...
  } else if (typeof define === 'function' && define.amd) {
    define('Module', [], M); // or RequireJS / AMD...
  } else {
    global.Module = M; // or browser
  }
  global.m=new M();

})(this.window || global);

  

posted @ 2018-07-22 01:31  meetrice  阅读(176)  评论(0编辑  收藏  举报