这是我的jQuery脚本的好模式吗?

我想把我的脚本组织在一个.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中有点新鲜。 感谢您的时间和答案。


这更多的是我将如何实现你正在尝试的模式:

// 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 || {} ); 

第一个变化是将每个“名称空间”分解为它自己的Module模式,所以私有变量不会从名称空间流出到名称空间(如果您确实希望它们对命名空间是私有的,那将更像C#)。 其次是,而不是访问window.MySite ,传递你想扩展的对象(在这种情况下,我称它为root )。 这会给你一些灵活性。

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

你在正确的轨道上...


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

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

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

如果你试图访问myObject.innerVariable它将返回undefined但如果你调用myObject.getter()它会正确返回值。 这个概念是您想要在JavaScript中进行阅读和编程的一个概念。 希望有所帮助。


您可能需要阅读Module模式(更多)并在JavaScript中关闭以防止污染全局命名空间。

链接地址: http://www.djcxy.com/p/55057.html

上一篇: Is this a good pattern for my jQuery scripts?

下一篇: How to open a new default browser window in Python when the default is Chrome