我尝试使用RequireJS和AMD模块定义,并编写了一个模块,用我认为的对象格式做我的事情。 (我从jquery开始,并没有很好地学习OOP javascript)
myModule.js
define([
jquery,
datepicker,
], function ($, datepicker) {
var myModule = {
debug: true,
lang: 'auto',
initModule: function (element) {
myModule.element = element;
},
// ... other methods
}
return myModule;
});
它运作良好,但如果我尝试使用它超过一个元素/时间它会覆盖他自己,我不能在同一页面中多次使用它。
main.js
requirejs(['MyModule'],
function (MyModule) {
// all the elements on page
$elements = $('.element');
$elements.each(function () {
MyModule.initModule($(this));
});
});
当我在页面上有多个<div class="element">
时,只有最后一个工作,我认为因为我的模块会覆盖他自己。
我尝试添加new MyModule()
但错误TypeError: MyModule is not a constructor
我认为我需要添加一个构造函数或其他东西,在任何情况下都要使用我的模块的实例而不是对象(我认为是由requirejs预编译并返回准备工作)。任何帮助都很好,非常感谢提前!
答案 0 :(得分:1)
确定!为此!我完全重构了我的代码,而不是在我的模块定义中返回一个对象,我在他的实例之后创建了一个get函数,我创建了一个用于重置属性/变量的构造函数:
myModule.js
define([
jquery,
datepicker,
], function ($, datepicker) {
// constructor
var myModule = function () {
// reset lang because it maybe was changed in previous instance,
// i think because javascript share this thing trough objects?
myModule.prototype.lang = 'auto';
}
myModule.prototype.debug = true
myModule.prototype.lang = 'auto';
myModule.prototype.initModule = function (element) {
myModule.element = element;
};
// ... other methods with `myModule.prototype.` prefix
return myModule;
});
很好,现在我可以调用myModule trough new myModuel()
语法,并为页面上的不同元素提供相同的功能。
main.js
requirejs(['MyModule'],
function (MyModule) {
// all the elements on page
$elements = $('.element');
var p = 1, _mod = [];
$elements.each(function () {
_mod[p] = new MyModule();
_mod[p].initModule($(this));
p++;
});
});
这项工作对我来说,我还不完全理解我做了什么,但我的目的是令人满意的,我可以在页面上为不同的元素重复使用相同的模块功能。
建议我阅读:? 我安全地需要阅读有关OOP Javascript,原型以及javascript如何在内存和名称空间中管理实例/类/对象/ var的内容。