这是我的jQuery脚本的一个很好的结构吗?

时间:2011-09-22 20:11:46

标签: javascript jquery idiomatic

我希望将我的脚本组织在我的所有网站的一个.js文件中(我现在搞得很乱),就像C#中的命名空间和类一样......

(function ($) {

    //private variables
    $.divref = $("#divReference");

    //Namespaces
    window.MySite = {};
    window.MySite.Home = {};
    window.MySite.Contact = {};

    //Public function / method
    window.MySite.Home.Init = function(params){
        alert("Init");

        MySite.Home.PrivateFunction();

        $.divref.click(function(){
            alert("click");
        });
    };

    //private function / method
    MySite.Home.PrivateFunction = function(){
        alert("Private");
    };

})(jQuery); 

这是jQuery和JScript中的惯用布局吗?

3 个答案:

答案 0 :(得分:3)

我会继续发表我的评论作为答案,虽然我不是100%它会解决你关于c#名称空间的问题以及它们在JavaScript中的相似之处(我不是c#程序员)。您实际上并没有创建私有变量,因为您将它们附加到此函数完成后将存在的$对象。如果你想要私有变量,你需要使用一个闭包。那些看起来像这样:

var myObject = function () {
  var innerVariable = 'some private value';

  return {
    getter: function () {
      return innerVariable;
    }
  }
}()

如果您尝试访问myObject.innerVariable,则会返回undefined,但如果您致电myObject.getter(),则会正确返回该值。这个概念是您希望在JavaScript中阅读的概念,以及一般的编程概念。希望有所帮助。

答案 1 :(得分:1)

这是我实现你想要做的模式的更多方式:

// MySite.Home Extension
window.MySite = 
    (function ($, root) {

        //private variables
        var $divref = $("#divReference");

        //private function / method
        var privateFunction = function(){
            alert("Private");
        };        

        root.Home = {};

        // Public variable
        root.Home.prop = "Click"

        //Public function / method
        root.Home.Init = function(params){
            alert("Init");

            private();

            $divref.click(function(){
                alert(root.Home.prop);
            });
        };

        return root;

    })(jQuery, window.MySite || {} );   

// MySite.Contact Extension
window.MySite = 
    (function ($, root) {

        root.Contact = {};

        // More stuff for contact

        return root;

    })(jQuery, window.MySite || {} ); 

第一个变化是将每个“命名空间”拆分为自己的模块模式,因此私有变量不会从命名空间流向命名空间(如果你打算将它们设置为命名空间的私有,那将更多是C#esque)。第二是不是访问window.MySite,而是传入你想要扩展的对象(在这种情况下,我称之为root)。这会给你一些灵活性。

您的私有方法并非真正私密。要创建一个私有方法,您只需要创建一个绑定在闭包中的函数var,而不是分配给外部可见对象上的属性。最后,您可能不想使用$.somegarbage。就像在评论中提到的那样,你要向$对象添加一个属性,当关闭完成时它仍然存在。如果你想要一些接近的东西,我只会使用某些人似乎喜欢做的$somegarbage,但任何变量名都适用于私有变量,只要变量绑定在闭包范围内(不是其他地方) )

你走在正确的轨道上......

答案 2 :(得分:0)

您可能希望阅读Module patternmore)和javascript中的闭包,以防止污染全局命名空间。