根据我之前在question收到的答案,我想知道如何简化以下的JavaScript模式。
通过简化我的意思是不重复Module.*method
来保持干燥。
离。
Module.one = function() {
//one
};
Module.two = function() {
//two
};
我认为这应该是这样的:
Moduje.js
var Module = (function(Module) {
init = function() {
console.log("init");
};
return Module;
})(Module || {});
Module.Users.js
var Module = Module || {};
Module.Users = (function(Users) {
init = function() {
console.log("Module.Users.init");
};
return Module.Users;
})(Module.Users || {});
这是原始代码。
Moduje.js
var Module = (function(Module) {
Module.init = function() {
console.log("init");
};
return Module;
})(Module || {});
Module.Users.js
var Module = Module || {};
Module.Users = (function(Users) {
Users.init = function() {
console.log("Module.Users.init");
};
return Users;
})(Module.Users || {});
答案 0 :(得分:0)
好:
var Module = (function(Module) {
init = function() {
console.log("init");
};
return Module;
})(Module || {});
不,那不行。您正在为该模块的“模块” 创建默认值。你在“init”的声明中也忘记了var
,在这种情况下,sort-of使它工作,但是以一种破碎的方式(因为它是一个全局变量,如果不是由于“严格”的错误模式可能被强制执行)。由于您使用该语句声明“Module”,因此将“Module”作为(可能的)参数传递没有任何意义。
我不知道“简化”这个词对你意味着什么;原来看起来不错。
编辑 - 如果您想要做的是摆脱对基础对象的重复引用,您可以使用“扩展”功能,无论是来自库还是您自己编写的:
function extend(target) {
var sources = Array.prototype.slice.call(arguments, 1), source;
for (var i = 0; i < sources.length; ++i) {
source = sources[i];
for (var key in source) {
if (source.hasOwnProperty(key))
target[key] = source[key];
}
}
return target;
}
然后你可以这样做:
var Module = createModule(); // make an object however you want
Module = extend(Module, {
newProperty_1: "hello world",
newProperty_2: function() {
// this will become a method on "Module"
},
newProperty_3: {
subObjectProperty: "whatever"
}
});