Выявление шаблона модуля с помощью конструктора
У меня возникли проблемы с поиском наилучшего способа реализовать это.
Я хочу модуль, который имеет конструктор, который принимает аргумент, который хранит его для последующего использования в модуле.
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
глобальный объект окна. Может кто-нибудь объяснить, как получить доступ к модулю? Я не понимаю, что происходит с this.moduleA = moduleA;
после конструктора. Я не разработчик javascript, поэтому, если я использую неправильный шаблон здесь или что-то, не стесняйтесь звонить.
Ответы
Ответ 1
Вы очень близки, но вам не хватает чего-то важного в вашем определении someMethod
.
EDIT: проще сказать, что работает, а что нет, если вы измените имя свойства модуля в 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/
Ответ 2
Попробуй это:
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();
Ответ 3
Вам нужно будет использовать 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);
Благодарю!