这是我的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