我很难找到实现这一点的最佳方法。
我想要一个具有构造函数的模块,该构造函数接受一个参数,该参数存储该模块以供以后在模块中使用。
var ModuleB = function(moduleA) {
this.moduleA = moduleA;
}
ModuleB.prototype = function() {
//private stuff/functions
function someMethod() {
moduleA.doSomething();
}
//public api
return {
someMethod : someMethod
};
}();
在其他一些文件中
//ModuleA defined elsewhere
var moduleA = new ModuleA();
//...
var module = new ModuleB(moduleA);
module.someMethod();
现在在上面的someMethod
中,moduleA是未定义的,而this
是全局窗口对象。有人能解释一下我将如何访问模块A吗?我不明白this.moduleA = moduleA;
在构造函数之后会发生什么。我不是一个真正的javascript开发人员,所以如果我在这里使用了错误的模式或其他什么,请随意加入。
您非常接近,但在someMethod
的定义中遗漏了一些重要内容。
编辑:如果您在ModuleB:中更改模块属性的名称,则更容易判断哪些有效,哪些无效
var ModuleA = function() {}
ModuleA.prototype = (function () {
return {
someMethod: function () {
return 'foo';
}
};
}());
var ModuleB = function(moduleA) {
this.innerModule = moduleA;
}
ModuleB.prototype = (function () {
return {
doStuff: function () {
return this.innerModule.someMethod();
}
};
}());
var moduleA = new ModuleA();
var moduleB = new ModuleB(moduleA);
console.log(moduleB.doStuff()); // prints "foo"
http://jsfiddle.net/mN8ae/1/
试试这个:
var ModuleB = function(moduleA) {
this.moduleA = moduleA;
}
// Simplifying your code, what was missin is the "this" keyword accessing the moduleA
ModuleB.prototype.someMethod = function() {
this.moduleA.doSomething();
};
var module1 = new ModuleB({
doSomething: function(){
alert('i do something');
}
});
module1.someMethod();
您需要使用call/apply来执行给定上下文的方法。
试试这个代码(我修改了你的代码)
var ModuleB = function(moduleA) {
this.moduleA = moduleA;
};
ModuleB.prototype = function() {
//private stuff/functions
function someMethod() {
this.doSomething();
}
//public api
return {
someMethod : someMethod
}; }();
var ModuleA=function(){
this.doSomething=function(){
alert('moduleA Method');
}; };
var modA=new ModuleA(); var modB=new ModuleB(modA);
modB.someMethod.call(modA);
谢谢!