将javascript分解成模块,我这样做对吗?
我使用的是javascript模块模式,到目前为止:将javascript分解成模块,我这样做对吗?,javascript,jquery,Javascript,Jquery,我使用的是javascript模块模式,到目前为止: var APP; if(APP == undefined) { APP = {}; } APP = (function() { var userId = -1; var privateVar = ''; var _init = function($userId) { userId = $userId; }; var _publicMethod = function($id){
var APP;
if(APP == undefined) {
APP = {};
}
APP = (function() {
var userId = -1;
var privateVar = '';
var _init = function($userId) {
userId = $userId;
};
var _publicMethod = function($id){
privateVar = id;
};
return {
init = function($userId) {
_init($userId);
},
publicMethod = function($id) {
_publicMethod($id);
}
};
})();
然后我有一个通用的utils模块:
APP.utils = (function(){
})();
然后每个页面我都计划有一个模块,所以我不会无缘无故地在这些DOM元素不存在的页面上连接事件(按钮点击等):
APP.homePage = (function(){
return {
};
})();
因此,每个模块都有一个init()方法,我将在页面上调用该方法来运行必须运行的东西(例如,连接事件、设置变量,如say userId等):
$(文档).ready(函数(){
APP.init();
APP.homePage.init(“abc”);
});
所以现在如果文件太大,我也可以把它们分成单独的文件
在我看来,模块模式是组织代码的一种非常好的方式。回答您的问题: 1) 是的,您的模块只能访问在其返回的对象中公开的其他模块的方法和属性 2) 我觉得你的编码风格看起来不错。我会做出以下改变:
APP = (function() {
var _userId = -1;
var _privateVar = '';
var init = function($userId) {
_userId = $userId;
};
var publicMethod = function($id){
_privateVar = id;
};
return {
init : init,
publicMethod : _publicMethod
};
})();
首先,下划线通常表示“私有”属性或方法。第二,您可以去掉返回对象中的额外函数,直接指向您关心的方法或属性。这通常被称为“显示模块模式”,因为即使是公共方法也没有在返回的对象中定义——它们只是被引用
3) 这种方法绝对是封装代码的好方法。您获得了私有和特权方法的好处,并且通常会得到更好的API,因为您只公开需要公开的内容
做得好。在我看来,模块模式是组织代码的一种非常好的方式。回答您的问题: 1) 是的,您的模块只能访问在其返回的对象中公开的其他模块的方法和属性 2) 我觉得你的编码风格看起来不错。我会做出以下改变:
APP = (function() {
var _userId = -1;
var _privateVar = '';
var init = function($userId) {
_userId = $userId;
};
var publicMethod = function($id){
_privateVar = id;
};
return {
init : init,
publicMethod : _publicMethod
};
})();
首先,下划线通常表示“私有”属性或方法。第二,您可以去掉返回对象中的额外函数,直接指向您关心的方法或属性。这通常被称为“显示模块模式”,因为即使是公共方法也没有在返回的对象中定义——它们只是被引用
3) 这种方法绝对是封装代码的好方法。您获得了私有和特权方法的好处,并且通常会得到更好的API,因为您只公开需要公开的内容
干得好
如果一个模块需要调用另一个模块,我想唯一可行的方法就是通过公共api来实现,对吗
对
e、 g.如果主页需要userId,我应该在主页#init方法中传递它吗
不。我不会在所有模块中重复userId
代码,而是在默认模块中为其提供一个公共getter
对编码有什么意见吗
此代码
var APP;
if(APP == undefined) {
APP = {};
}
APP = ...
这是毫无用处的。您不需要在此处检查对象是否存在,因为您无论如何都会覆盖它。这也意味着此代码必须首先执行。如果要使模块独立于加载顺序,则需要使用
var APP = (function(a) {
var private_vars; // ...
a.init = ...
a.publicMethod = ... // add them to the object instead of creating new one
a.getPrivate = function() {
return private_vars;
};
return a;
})(APP || {}); // create one iff not already existing
// other file:
var APP = APP || {};
APP.utils = ... // add object to namespace
代码
var _publicMethod = function($id){
privateVar = id;
};
看起来有点奇怪。首先,下划线通常表示对象的半私有(公共但不使用)属性,不应用于变量名。这里的情况并非如此,因为函数将作为APP
的“publicmethod”属性公开。如果需要,请在此处使用下划线。其次,这里不需要使用函数表达式。代码位于模块的本地作用域中,使用函数声明可以使其在该作用域中的任何地方都可用,并允许命名函数。你应该使用
function publicMethod($id) {
privateVar = id;
}
a.publicMethod = publicMethod;
如果一个模块需要调用另一个模块,我想唯一可行的方法就是通过公共api来实现,对吗
对
e、 g.如果主页需要userId,我应该在主页#init方法中传递它吗
不。我不会在所有模块中重复userId
代码,而是在默认模块中为其提供一个公共getter
对编码有什么意见吗
此代码
var APP;
if(APP == undefined) {
APP = {};
}
APP = ...
这是毫无用处的。您不需要在此处检查对象是否存在,因为您无论如何都会覆盖它。这也意味着此代码必须首先执行。如果要使模块独立于加载顺序,则需要使用
var APP = (function(a) {
var private_vars; // ...
a.init = ...
a.publicMethod = ... // add them to the object instead of creating new one
a.getPrivate = function() {
return private_vars;
};
return a;
})(APP || {}); // create one iff not already existing
// other file:
var APP = APP || {};
APP.utils = ... // add object to namespace
代码
var _publicMethod = function($id){
privateVar = id;
};
看起来有点奇怪。首先,下划线通常表示对象的半私有(公共但不使用)属性,不应用于变量名。这里的情况并非如此,因为函数将作为APP
的“publicmethod”属性公开。如果需要,请在此处使用下划线。其次,这里不需要使用函数表达式。代码位于模块的本地作用域中,使用函数声明可以使其在该作用域中的任何地方都可用,并允许命名函数。你应该使用
function publicMethod($id) {
privateVar = id;
}
a.publicMethod = publicMethod;
您还应该看看require.js。这可能是一个问题,因为您也应该看看require.js。这可能是一个问题,因为您能否给出一个在默认模块中公开公共属性的示例,我只添加了一些方法,因此希望确保我做得正确谢谢!请参阅带有变量的示例。公共属性添加到闭包内部的模块中