在JavaScript中创建Namespace/Class类型结构的最优雅方式

Gga*_*Gga 9 javascript jquery closures design-patterns module

我试图找到一种方法,它将为我提供最优雅的方式将我的代码包装在Namespace/ Unitlike对象中.例如谷歌地图API var a = Google.Maps.Foo();,我觉得它看起来很干净.

我希望它也包括(如果这是正确的术语)jQuery No Conflict $标志.

到目前为止我很喜欢:

// Top level container for sub objects
var myApp = myApp || {}; 

// An object to be held in myApp     
(function( skillet, $, undefined ) {

    //Private Property
    var isHot = true;

    //Public Property
    skillet.ingredient = "Bacon Strips";

    //Public Method
    skillet.fry = function() {
        var oliveOil;

        addItem( "\t\n Butter \n\t" );
        addItem( oliveOil );
        console.log( "Frying " + skillet.ingredient );

        return "Fried!";
    };

    //Private Method
    function addItem( item ) {
        if ( item !== undefined ) {
            console.log( "Adding " + $.trim(item) );
        }
    }   

}( window.myApp.skillet = window.myApp.skillet || {}, jQuery ));
Run Code Online (Sandbox Code Playgroud)

任何人都可以扩展这一点,指出潜在的问题,或者只提供更好的方法吗?

kay*_*yz1 11

检查此JavaScript模块模式 和此学习JavaScript设计模式

模块示例:

var MyModule = (function($){
  var MY_CONSTANT = 123;

  var _myPrivateVariable = 'TEST MEH';
  var _$myPrivateJqueryObject = $('div.content');

  var _myPrivateMethod = function(){
    alert('I am private!');
  };

  var myPublicMethod = function(){
    console.log('Public much?');
  }

  return {
      myPublicMethod : myPublicMethod 
  };

})(jQuery);

MyModule.myPublicMethod();
Run Code Online (Sandbox Code Playgroud)

类示例:

function Person(name, age){
   this.name = name || '';
   this.age = age || -1;
}

Person.prototype.greet= function(){
   console.log('Hi! My name is' + this.name + '. Old ' + this.age + ' I am.');
}

var person = new Person("John", 12);
person.greet();
Run Code Online (Sandbox Code Playgroud)

  • 应该注意,这两种模式不相互竞争.Module模式严格用于创建单例命名空间(或一组相关的单例命名空间),而Class模式为您提供构成多个实例基础的东西.使用Class模式,您还应该意识到(以上面的方式编写)需要使用`new`调用 - 这一点已在[此处]进行了详细讨论(http://ejohn.org/blog/simple -class-instantiation /) - 如果你能按照每个单词,那么你做得很好 - 我不时重读它. (2认同)