我正在尝试使用requireJS来了解javascript AMD模式。我是面向对象编程的新手,也是requireJS的新手。我希望有人可以帮助我。
我用对象文字定义了一个名为'module3'的测试模块:
define([], function () {
var _name = 'this is a test3';
var returnedModule3={
name:'test',
getName:getName
}
function getName() {
return _name;
}
return returnedModule3;
});
但是在main.js文件中,当我在加载文件后调用此模块时,我在firebug中遇到错误,说“ TypeError:module3ref不是构造函数”。您将在下面看到我的主文件中的代码:
// Load modules and use them
require(['myModule/module3'], function(module3ref){
// do something with the loaded modules
var module3 = new module3ref();
console.log("module3.getName:"+module3.getName());
});
这是否意味着我们不能使用object literal来创建模块?
答案 0 :(得分:3)
按字面解释问题的标题:RequireJS can turn object literals directly into AMD modules,例如:
define({
getName: function() {
return 'this is a test3';
},
name: 'test'
})
但是,使用这种模式,一个属性不可能引用它的“邻居”(但这是JS对象文字语法的限制,而不是RequireJS本身)。
答案 1 :(得分:1)
我试过了我的一面。试试这个:
define([], function () {
var _name = 'this is a test3';
var returnedModule3 = function(){
this.name = 'test';
this.getName = getName
}
function getName() {
return _name;
}
return returnedModule3;
});
注意:this
应附加到returnedModule3
中的每个属性,以便从外部/其他JS文件访问,否则它将变为私有功能,您将获得错误object has no method getName
。
您的代码问题:在您的代码中,您尝试创建对象实例。
另一种方法(出口对象):
如果您要导出Object
,就像returnedModule3
一样,那么必须将main.js
定义为:
require(['module3'], function(module3ref){
// do something with the loaded modules
console.log("module3.getName:"+module3ref.getName());
});