JavaScript中创建Namespace/Class类型结构的最优雅的方法是什么?

9
我希望找到一种最优雅的方法,可以将我的代码封装在类似于Namespace/Unit的对象中。例如Google Maps 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 ));

有人能否详细说明此事,指出可能存在的问题,或者提供更好的方法论呢?

2
没有一种优雅的方法来做某件事,因为优雅是主观的。 - Philipp
你需要做出最好的决定的所有信息都在这里:https://dev59.com/IXNA5IYBdhLWcg3wpfmu - NinjaNye
@NinjaNye 啊,是的,那就是代码的来源,我正在尝试扩展它。 - Gga
1
在我看来,最好将所有函数定义为私有的,然后在一组语句中公开必要的内容。例如,function fry() {...} 然后 skillet.fry = fry;。这样做有双重优点:允许内部函数调用不需要 skillet. 前缀,并且可以轻松观察/调整公共方法。 - Beetroot-Beetroot
@Beetroot-Beetroot 真不错。现在我只公开了一个方法,之前由于进行异步请求而公开了几个方法。好东西,谢谢。 - Gga
显示剩余3条评论
1个回答

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();

类示例:

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();

不错的文章 :) (尽管第二篇有点笨拙) - Simon
这是一本由谷歌工程师 Addy Osmani 写的书 :) - kayz1
1
未转义的单引号刺痛我们的眼睛 ;) - Peter Herdenborg
既然没有这样的东西,你实际上不需要它。如果你有一个变量,你检查它的作用域,如果你想知道什么被导出了,你看一下返回语句对象字面量就行了。 - Bergi
2
需要注意的是,这两种模式并不相互竞争。模块模式严格用于创建单例命名空间(或一组相关的单例命名空间),而类模式则为您提供了多个实例形成基础的东西。对于类模式,您还应该知道(按照上面的方式编写),它需要使用new进行调用 - 这一点在此处得到了彻底讨论 - 如果您能理解每个单词,那么您做得很好 - 我时不时地会重新阅读它。 - Beetroot-Beetroot
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接