indexedDB: Что делает _proto_ в объектах базы данных? - PullRequest
0 голосов
/ 07 августа 2020

Изменилось ли что-то в способе хранения объектов в indexedDB, по крайней мере, в Firefox?

Теперь я замечаю, что на вкладке хранилища инструментов разработчика появляется "_proto_". Я не особо задумывался об этом, пока не заметил странное поведение в моей программе, которое я не мог понять.

Я думал, что объекты были клонированы перед записью в базу данных, так что независимо от того, как они были созданы, они были независимыми. Например, когда база данных создается впервые, добавляются некоторые объекты сопоставления; и, поскольку несколько из них имеют одинаковый макет / структуру, ссылка на один объект используется многократно, как показано ниже.

Когда страница загружается, данные сопоставления считываются в ОЗУ и используются для управления назначением ключи базы данных. Если я действительно не запутался, похоже, что prop_3 - prop_7 сохраняют общую ссылку при последующем извлечении из базы данных при перезагрузке страницы, так что если одно из свойств в prop_3 обновляется, то же свойство обновляется в prop_3 через prop_7.

Так оно и должно работать? Я ожидал, что prop_3 - prop_7 больше не будет использовать общую ссылку после записи и чтения из базы данных.

Если это верно, могут ли объекты быть записаны в базу данных таким образом, чтобы эти типы общих ссылок не сохранится? Конечно, я понимаю, что их можно назначить по-другому, не используя ссылку на repeat_object; и, по сути, это исправляет конкретную проблему c для меня. Спасибо.

repeated_object = { ...property : value... };
os.add( { 'prop_1' : 1, 
          'prop_2' : 2,
          'prop_3' : repeated_object, 
          'prop_4' : repeated_object,
          'prop_5' : repeated_object,
          'prop_6' : repeated_object,
          'prop_7' : repeated_object  } );

1 Ответ

0 голосов
/ 08 августа 2020

Как сериализуется ссылка на объект, который не был записан в базу данных? Когда этот примерный объект извлекается из базы данных, эти последние пять свойств по-прежнему обрабатываются как ссылки на один и тот же объект.

Да, это ожидалось. IndexedDB не использует что-то вроде JSON.stringify(value), которое бы сериализовало объект несколько раз, если бы на него ссылались несколько раз. Вместо этого он использует структурированное клонирование , которое поддерживает не только сериализацию большего количества типов, но также циклические или общие ссылки.

Это новое в Firefox?

Нет, это должно быть единообразно во всех браузерах.

и выполняется ли это через _proto_?

Нет, совсем нет. Это не имеет к этому никакого отношения. Структурированная сериализация не сохраняет объекты-прототипы (кроме встроенных).

...