Форум программистов, компьютерный форум, киберфорум
JavaScript: API
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
9 / 9 / 1
Регистрация: 04.07.2012
Сообщений: 218

Конструктор класса вызывается при каждом обращении к объекту. Google App Scripts

07.09.2023, 14:18. Показов 973. Ответов 3

Студворк — интернет-сервис помощи студентам
Привет. Что-то я тут нагородил такого, что у меня при каждом обращении к объекту создаётся новый объект, хотя планировалось что это будет вообще singleton. Пишу в apps script, средства отладки здесь минимальны.

Виджет боковой панели обращается к данным раз в секунду:

JavaScript
1
2
3
google.script.run
            .withSuccessHandler(onPersonChange)
            .callback_getCurrentPerson();
И каждую секунду всплывает сообщение "Вызван конструктор". Почему?

Вот полный текст модуля:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
var spread = SpreadsheetApp.getActiveSpreadsheet();
var msg = function(text) {spread.toast(text, "", 5)}; 
var sheet = SpreadsheetApp.getActiveSheet();
var panel = HtmlService.createHtmlOutputFromFile("person_details_panel.html");
 
class TableNavigator {
 
  constructor() {
    if (TableNavigator._instance) return TableNavigator._instance;
    TableNavigator._instance = this;
 
    msg(`${TableNavigator._instance} Вызван конструктор`);       // <----  срабатывает при каждом обращении к объекту
 
    TableNavigator._currentRow = 1;
 
    // Берём имена всех колонок в таблице и создаём нашему объекту удобные методы с теми же именами
    let headers = sheet.getRange(1,1,1, sheet.getLastColumn()).getValues()[0];
    headers.forEach((value, index) => {
      let col_idx = index+1;
      let col_val = value.trim();
      Object.defineProperty(this, col_val, {   
        get: ( ) => sheet.getRange(TableNavigator._currentRow, col_idx).getValue(),
        set: new_value => sheet.getRange(TableNavigator._currentRow, col_idx).setValue(new_value)
      });
      Object.defineProperty(this, col_val+'IsProtected', {   
        get: ( ) => sheet.getRange(TableNavigator._currentRow, col_idx).getBackgroundColor() === "#ffffff"
      });
    });
  }
 
  
  seek(row){TableNavigator._currentRow = row}
  get currentRow(){return TableNavigator._currentRow}
 
}
 
var person = new TableNavigator(); 
 
 
 
function callback_getCurrentPerson(){
  msg(`GetCurPers ret ${JSON.stringify(person)}`);
  return JSON.stringify(person);
}
 
 
 
 
function panel_show() {
 person.seek(selectedRow);
 panel.currentRow = person.currentRow;
 SpreadsheetApp.getUi().showSidebar(panel);
 panel.currentRow = person.currentRow;
}
Добавлено через 15 минут
Я, короче, весь в расстройствах, буду сейчас тупо делать с глобальной переменной, что там хранить экземпляр класса. Потому что даже ChatGPT ошибок в этом модуле не нашёл)) Какая-то заморочка, специфическая для гуглов, должно быть
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.09.2023, 14:18
Ответы с готовыми решениями:

При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О
Вот такой кодclass A { public: A(){} virtual ~A(){} }; class C { public:

Почему конструктор вызывается при присвоении объекта другому объекту
оператор+ выполняется нормально, но когда уже переменная в sum, на след шаге она вызывает конструктор, ибо у меня в примере 9 выходит. А в...

Ошибка при обращении к объекту другого класса
Когда пытаюсь с класса Drone вызвать через его объект функцию из класса Widget то появляется такая ошибка: ошибка: 'Widget' does not name...

3
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3844 / 1700 / 431
Регистрация: 14.03.2022
Сообщений: 4,342
07.09.2023, 14:33
Цитата Сообщение от Postscripter Посмотреть сообщение
даже ChatGPT ошибок в этом модуле не нашёл))
Ну после этого человек просто бессилен...
0
9 / 9 / 1
Регистрация: 04.07.2012
Сообщений: 218
07.09.2023, 15:12  [ТС]
Вот кстати, смех смехом, а три часа назад Яндекс выкатил YaGpt2. Знаете, чего она мне сказала? Что у гугла коллбэки выполняются в отдельном потоке! И весь мой модуль будет выполняться сверху донизу раз в секунду. Во как.

Добавлено через 2 минуты
Это конечно всё объясняет, но выглядит дико. Такой расход ресурсов... Что делать, как вычленить общий код, который выполнится только один раз?

Добавлено через 19 минут
Никак?)
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3844 / 1700 / 431
Регистрация: 14.03.2022
Сообщений: 4,342
07.09.2023, 16:33
Postscripter, чисто "рассуждательно"...
В модуль ведь можно импортировать готовый экземпляр класса. Или как-то "замкнуть" экземпляр класса на обработчике.

Но я с гугло-колбеками дела не имел...
Х/з что за зверь и как его использовать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.09.2023, 16:33
Помогаю со студенческими работами здесь

Вылетает программа при обращении к объекту класса
итак, есть абстрактный базовый класс &quot;дерево&quot;, есть два его наследника: плодовое дерево и лесное дерево. Надо написать класс...

Получить некоторое поле при обращении к объекту, созданному из класса
Здравствуйте, уважаемые У меня есть простой класс class Test{ constructor( note ){ this.note = note; } }

Конструктор класса не вызывается
Предположим есть файл с исходником main.cpp #include &lt;iostream&gt; #include &quot;my.h&quot; using namespace std; int main() { box my;...

this(Всегда ли вызывается конструктор при не явной передачи объекта в конструктор)
class Test { int i; public: void test(int i) { this -&gt; i = i; } }; Конструктор Test::Test всегда вызывается...

Не вызывается конструктор класса MainPage
В файле MainPage.xaml я добавляю пользовательский интерфейс. В файле MainPage.xaml.cs в конструкторе класса я пишу this.Content = null; То...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru