Я определил вспомогательный класс для создания некоторых объектов. Как объекты A содержат Bs, я пытаюсь вызвать createB из createA, но получаю «Uncaught ReferenceError: createB не определен». JS не мой основной язык так пожалуйста, прости меня, если это что-то очевидно;)Javascript - Доступ к статическому методу из другого статического метода throws ReferenceError
Вот мой код:
define([
"model/A",
"model/B",
"model/C"
], function (A, B, C) {
return {
addTo: function (params, key, target, source) {
if (params[key] !== undefined && params[key] !== null) {
target.set(key, params[key], source);
}
},
createA: function (params, source) {
var result = new A();
...
bDefs.forEach(function(bDef) {
result.get("bs").push(this.createB(params,source));
});
return result;
},
createB: function (params, source) {
var result = new B();
...
result.get("cs").push(createC(params,source));
return result;
},
createMediaType: function (params, source) {
var result = new C();
...
return result;
}
};
});
EDIT: чтение этот вопрос еще раз я заметил, что я опущено что-то важное, что может быть причина проблемы: я вызываю createB() изнутри forEach. Я полагаю, что анонимная функция не имеет видимости остальной части класса. Как я могу передать ссылку на на forEach?
Это не хорошо на SO редактировать вопрос такой, что редактирование аннулирует существующие ответы на вопрос так, как было, поэтому я удалил 'this.' из вызова' createB', который вы добавили с помощью редактирования. Как сказано в [algiogia] (http://stackoverflow.com/questions/37696799/javascript-accessing-static-method-from-another-static-method-throws-reference/37696945?noredirect=1#comment62869281_37696945), решение в мой ответ также касается проблемы 'forEach'. Я также обновил ответ, чтобы показать вам, как сделать работу 'forEach', если вы хотите продолжить использование' this'. –
@ T.J.Crowder Я отредактировал вопрос, потому что это было неправильно. Копирование кода в SO Я пропустил соответствующую часть. В первоначальной версии я также упомянул, что уже пытался использовать «this.createB()». Ваш ответ по-прежнему действителен. – algiogia
Даже если вы просто разместили код неправильно, было бы неуместно, если бы он исправил его * после получения ответа, который был признан недействительным *. Однако, как вы заметили, ваш первоначальный вопрос * сделал * в конце этого вопроса о 'this.createB' (я пропустил это!), Поэтому в этом случае он не применяется. Кстати, в моем комментарии выше, я имел в виду «как сказал джамец», а не «как сказал альгогия» - да! –