Spec-Zone.ru › JavaScript

TypeError: Повторная инициализация объекта — это ошибка при наличии закрытых полей/методов

Исключение JavaScript "Initializing an object twice is an error with private fields/methods" возникает, когда объект, созданный через конструктор класса, снова проходит конструирование класса, и класс содержит закрытый элемент. Обычно это вызвано приемом переопределения возвращаемого значения.

Сообщение

TypeError: Cannot initialize #x twice on the same object (V8-based)
TypeError: Initializing an object twice is an error with private fields (Firefox)
TypeError: Cannot redefine existing private field (evaluating 'super(o)') (Safari)

TypeError: Cannot initialize private methods of class X twice on the same object (V8-based)
TypeError: Initializing an object twice is an error with private methods (Firefox)
TypeError: Cannot install same private methods on object more than once (evaluating 'super(o)') (Safari)

Тип ошибки

TypeError

Что пошло не так?

Для любого объекта, если он уже содержит закрытое поле или метод, будет ошибкой установить то же поле снова. Закрытые элементы устанавливаются на значение this при вызове конструктора класса, поэтому эта ошибка может произойти, если значение this является уже сконструированным экземпляром этого класса.

Обычно this в конструкторе — это вновь созданный объект, который не имеет каких-либо существующих свойств. Однако он может быть переопределен возвращаемым значением базового класса. Если базовый класс возвращает другой объект, этот объект заменит текущий объект в качестве значения this:

class Base {
  constructor(o) {
    // This object will become the this value of any subclass
    return o;
  }
}

class Derived extends Base {
  #x = 0;
}

Если вы вызываете new Derived(anyObject), где anyObject не является экземпляром Derived, конструктор Derived будет вызван с anyObject в качестве значения this и, следовательно, установит закрытое поле #x на anyObject. Это прием «переопределения возвращаемого значения», который позволяет определять произвольную информацию на несвязанных объектах. Однако, если вы вызываете new Derived(new Derived()), или снова вызываете new Derived(anyObject), конструктор Derived попытается снова установить закрытое поле #x на объекте, который уже имеет закрытое поле #x, что вызовет эту ошибку.

Смотрите также

  • Классы
  • Закрытые элементы

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Private_double_initialization

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API