我希望将我的脚本组织在我的所有网站的一个.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中的惯用布局吗?
答案 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 pattern(more)和javascript中的闭包,以防止污染全局命名空间。