Доброго времени суток ! Среда IskraJS отказывается выполнять код: (ниже синтетический пример, классы очень большие, но они точно отражают ситуацию): Код (Javascript): function class_1() { this.A_1; this.B_1; } class_1.prototype.func_class_1 = function() { /* здесь идет работа с this.A_1, this.B_1 */ }; function class_2 (_obj /*object of type class_1*/) { this.A_2; this.B_2; this.Obj_2 = _obj; } class_2.prototype.func_class_2 = function() { //вот здесь и происходит проблема с вызовом "func_class_1()" this.Obj_2.func_class_1(); }; var o1 = new class_1(); var o2 = new class_2(o1); o2.func_class_2(); Сообщение среды: "Uncaught Error: Field or method "func_class_1()" does not already exist, and can't create it on undefined" Прошивка "Based on Espruino 1v92.194" Сама программа собирается без ошибок, каждый класс может выступать как самодостаточный объект и при проверке работоспособности в "автономном" режиме проблем не возникает, только когда из под "второго" объекта вызывают функцию которая внутри себя вызывает ф-ю первого класса переданного с конструктором в качестве параметра. Перебрал все варианты с this, call, bind не помогло.
Необходимое добавление выделил: Код (C++): function class_1() { this.A_1; this.B_1; return this; // ВОТ ЭТУ СТРОЧКУ ДОБАВИТЬ } Это же касается и функции-конструктора class_2 - нет return this в конце.
Приветствую, коллеги ! Можно обосновать рекомендацию с возвратом this, желательно с ссылкой на стандарт? Я связался с Гордоном он проверил код на текущей версии Espruino, и на версии v1.92, его ответ - в обеих случаях код работает без модификации какой либо модификации. На форуме javascript.ru также ответили (с демонстрацией работой кода из под браузера), что код должен работать без модификации. Что касается возврата this при создании объекта то ни вижу в этом смысла, т.к. я в качестве параметра конструктора второго объекта явно передаю первый объект и по сути контекст вызова четко определен (по крайней мере я не вижу иного). Но помимо этого я попробовал все известные мне в javascript варианты явно передать контекст - вызов через call, apply, bind. Ни один из методов не сработал, хотя с учетом абсолютно явной передачи контекста, простоя обязан был. Хотелось услышать мнение команды Амперки.
что я хочу от микроконтроллера не имеет к сути моего вопроса никакого значения, реальный пример содержит примерно 1 000 строк кода, перебрасывать не удобно для обсуждения ситуации
Обосновать не могу, я художник, я так привык писать Интересное поведение, кстати, надо подумать, в чём проблема. Вы можете привести МИНИМАЛЬНЫЙ пример, ВОСПРОИЗВОДЯЩИЙ ошибку? Не просто синтаксический пример, а именно код с проблемой, минимальный? Что-то не так с контекстами, кмк.
Ещё смущает вот это. Вы уверены, что this.Obj_2 не undefined? Такое чувство, что просто ошибка синтаксическая, русская "с" вместо латинской "c", например (или что-то в этом роде).
Нет, синтаксической ошибки нет, я уверен на 98% ), в первую очередь в ручками перезатер название функции и написал, заново, но суть не в этом в реальном коде, в "объекте 2" не одна ф-я вызывается, а порядка пяти, их вызов приводит к одинаковой ошибке. Да завтра выложу полный код.
Прошивка код отрабатывает, ошибка оказалась все таки в дебрях одной из рукописных библиотек, в ее недрах действительно происходила потеря контекста. Всем спасибо !