什么';这两种JavaScript模式的区别是什么
我正试图更好地组织我的JavaScript。我的目标是有一个模块化的体系结构,我可以将其分解为单独的文件(sitename.js、sitename.utils.js等) 我想知道这两种模式的优点和缺点是什么,哪一种模式更适合分解成独立文件中的模块 模式#1(模块模式) 模式#2(单态)什么';这两种JavaScript模式的区别是什么,javascript,design-patterns,Javascript,Design Patterns,我正试图更好地组织我的JavaScript。我的目标是有一个模块化的体系结构,我可以将其分解为单独的文件(sitename.js、sitename.utils.js等) 我想知道这两种模式的优点和缺点是什么,哪一种模式更适合分解成独立文件中的模块 模式#1(模块模式) 模式#2(单态) 就我个人而言,我建议扩展#1,如下所示: var Module = (function(Module) { // A comment Module.variable1 = 3; /** * i
就我个人而言,我建议扩展#1,如下所示:
var Module = (function(Module) {
// A comment
Module.variable1 = 3;
/**
* init()
*/
Module.init = function() {
console.log("init");
};
// ...
return Module;
})(Module || {});
我喜欢这种模式有两个原因。第一,当所有函数都是声明而不是大散列时,文档(特别是javadoc样式)看起来更自然。第二,如果子模块的大小增加,它允许您在不进行任何重构的情况下将它们分解为多个文件
例如,如果Module.Users要进入其自己的文件:
var Module = Module || {};
Module.Users = (function(Users) {
/**
* init()
*/
Users.init = function() {
console.log("Module.Users.init");
};
// ...
return Users;
})(Module.Users || {});
现在,“module.js”和“module.users.js”可以是单独的文件,并且无论加载顺序如何,它们都可以工作。还要注意模块名的局部范围-如果模块名很长,这非常方便,因为您可以使用“MyApp.Users.EditScreen”并在模块定义的范围内使用类似“ES”的变量引用它。第一种模式允许通过闭包使用私有变量、方法等。例如:
var MODULE = (function () {
var privateStuff = 'This is private';
var doStuff = function(obj) {
console.log('Doing stuff...');
console.log(privateStuff);
};
return {
common: {
init: function() {
console.log("common.init");
doStuff(this);
}
},
users: {
init: function () {
console.log("users.init");
},
show: function () {
console.log("users.show");
}
}
}
})();
privateStuff
和doStuff
不是对象的属性,除了返回模块
的函数中定义的内容外,其他内容都不可用。因此,用#2演示如何实现这一点是不可能的
JS没有私有成员的概念,因此不能通过常规对象文本定义它们。所以,如果你需要私人物品,就选择第一种。如果您不这样做,那么#2就更简单了。您编写的代码基本相同。但是,随着代码的发展,第一种形式更容易使用,因为它允许您添加私有变量和函数。第二种形式不支持这一点,您最终几乎总是想要第一种形式。首先想到的是,模式1允许初始化代码,其中可能包含立即超出范围的变量或函数声明,新模式还允许以其他方式扩展模块。有一篇关于javascript模块的非常好的文章,关于这是好的,但是我得到了一个错误——或者我以错误的方式初始化Module.Users。这是我的错误——“Module.Users”前面不应该有一个var(因为全局模块已经定义)。我会把它删掉。
var Module = Module || {};
Module.Users = (function(Users) {
/**
* init()
*/
Users.init = function() {
console.log("Module.Users.init");
};
// ...
return Users;
})(Module.Users || {});
var MODULE = (function () {
var privateStuff = 'This is private';
var doStuff = function(obj) {
console.log('Doing stuff...');
console.log(privateStuff);
};
return {
common: {
init: function() {
console.log("common.init");
doStuff(this);
}
},
users: {
init: function () {
console.log("users.init");
},
show: function () {
console.log("users.show");
}
}
}
})();