Потеря видимости внутренних ф-й при передаче объекта как параметр (РЕШЕНО)

Тема в разделе "Iskra JS, Espruino, Йодо", создана пользователем Konkery, 5 дек 2017.

  1. Konkery

    Konkery Гик

    Доброго времени суток !
    Среда 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 не помогло.
     
  2. ИгорьК

    ИгорьК Гуру

    ... и что Вы хотите от микроконтроллера?
     
  3. ИгорьК

    ИгорьК Гуру

    ... и что Вы хотите от микроконтроллера?
     
  4. DIYMan

    DIYMan Guest

    Необходимое добавление выделил:
    Код (C++):
    function class_1()
    {
    this.A_1;
    this.B_1;
    return this; // ВОТ ЭТУ СТРОЧКУ ДОБАВИТЬ
    }
    Это же касается и функции-конструктора class_2 - нет return this в конце.
     
    Konkery и ИгорьК нравится это.
  5. Konkery

    Konkery Гик

    Приветствую, коллеги !
    Можно обосновать рекомендацию с возвратом this, желательно с ссылкой
    на стандарт?
    Я связался с Гордоном он проверил код на текущей версии Espruino,
    и на версии v1.92, его ответ - в обеих случаях код работает без модификации
    какой либо модификации
    .
    На форуме javascript.ru также ответили (с демонстрацией работой кода
    из под браузера), что код должен работать без модификации.
    Что касается возврата this при создании объекта то ни вижу в этом смысла, т.к. я в
    качестве параметра конструктора второго объекта явно передаю первый объект и по сути
    контекст вызова четко определен (по крайней мере я не вижу иного).
    Но помимо этого я попробовал все известные мне в javascript варианты явно передать
    контекст - вызов через call, apply, bind. Ни один из методов не сработал, хотя с учетом
    абсолютно явной передачи контекста, простоя обязан был.
    Хотелось услышать мнение команды Амперки.
     
  6. Konkery

    Konkery Гик

    что я хочу от микроконтроллера не имеет к сути моего вопроса никакого значения, реальный пример содержит примерно 1 000 строк кода, перебрасывать не удобно для обсуждения ситуации
     
  7. DIYMan

    DIYMan Guest

    Обосновать не могу, я художник, я так привык писать :) Интересное поведение, кстати, надо подумать, в чём проблема. Вы можете привести МИНИМАЛЬНЫЙ пример, ВОСПРОИЗВОДЯЩИЙ ошибку? Не просто синтаксический пример, а именно код с проблемой, минимальный? Что-то не так с контекстами, кмк.
     
  8. DIYMan

    DIYMan Guest

    Ещё смущает вот это. Вы уверены, что this.Obj_2 не undefined? Такое чувство, что просто ошибка синтаксическая, русская "с" вместо латинской "c", например (или что-то в этом роде).
     
  9. Konkery

    Konkery Гик

    Нет, синтаксической ошибки нет, я уверен на 98% ), в первую очередь в ручками перезатер название функции и написал, заново, но суть не в этом в реальном коде, в "объекте 2" не одна ф-я вызывается, а порядка пяти, их вызов приводит к одинаковой ошибке.
    Да завтра выложу полный код.
     
  10. Konkery

    Konkery Гик

    Прошивка код отрабатывает, ошибка оказалась все таки в дебрях одной из рукописных библиотек, в ее недрах действительно происходила потеря контекста.
    Всем спасибо !
     
    arkadyf нравится это.