Почему StructuredClone выдает DataCloneError при клонировании прокси-сервера, обертывающего встроенный объект? [дубликатJavascript

Форум по Javascript
Ответить
Anonymous
 Почему StructuredClone выдает DataCloneError при клонировании прокси-сервера, обертывающего встроенный объект? [дубликат

Сообщение Anonymous »

Недавно я столкнулся с проблемой при попытке глубокого клонирования прокси-объекта с помощью современного API StructuredClone.
Когда я использую StructuredClone для обычного объекта Date, он работает должным образом. Однако если я оберну эту дату в прокси (даже с пустым обработчиком), StructuredClone выдаст исключение DOMException (DataCloneError). Я ожидал, что он либо клонирует целевую дату, либо клонирует свойства в простой объект, но не выдаст ошибку.
Вот минимальный воспроизводимый пример:

Код: Выделить всё

const originalDate = new Date('2023-01-01');
const proxyDate = new Proxy(originalDate, {});

// Works fine
console.log(originalDate.toISOString());
// Output: "2023-01-01T00:00:00.000Z"

// Works fine (proxy forwards the get request)
console.log(proxyDate.toISOString());
// Output: "2023-01-01T00:00:00.000Z"

// Works fine
const cloneOriginal = structuredClone(originalDate);
console.log(cloneOriginal instanceof Date); // true

// THROWS ERROR in Chrome/Firefox/Node.js
try {
const cloneProxy = structuredClone(proxyDate);
} catch (e) {
console.error(e);
// Uncaught DOMException: Failed to execute 'structuredClone' on 'Window':
// # could not be cloned.
}

Я понимаю, что StructuredClone использует алгоритм структурированной сериализации. Я также знаю, что JSON.stringify работает с прокси (запуская toJSON или читая свойства), но StructuredClone, кажется, ведет себя по-другому.
Почему StructuredClone не разворачивает прокси-сервер и не обрабатывает его как простой объект? Предусмотрено ли такое поведение спецификацией HTML для структурированного клонирования «экзотических объектов» или это потому, что у прокси нет внутренних слотов (

Код: Выделить всё

[[DateValue]]
), требуемые алгоритмом клонирования, даже если они есть у цели?

Подробнее здесь: https://stackoverflow.com/questions/798 ... wrapping-a
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»