Последствия для производительности объекта после вызова/во время выполнения.defineProperty


Если на этапах загрузки скрипта многие свойства определяются с помощью объекта.defineProperty, объект.определите свойства или объект.творить. И большинство дескрипторов являются либо недоступными для записи (если не являются средствами доступа), либо не конфигурируемыми, не перечисляемыми или комбинированными. По сравнению с обычным назначением или инициализацией объекта, какова разница в пассивной производительности, если таковая имеется, и разница в производительности доступа к целевым свойствам?

Я слышал, что определение неписьмого и/или неконфигурируемые свойства включают в себя установку защитных устройств для предотвращения записи и / или повторного определения будет одной из причин потери производительности, верно ли это?

Пример определения:

Object.defineProperty(window, 'foo', {
    configurable: false,
    enumerable: false,
    writable: false,
    value: 10
});
1 2

1 ответ:

Создание свойств с помощью объекта.defineProperty/defineProperties определенно медленнее, чем простое их назначение. (Сколько? Зависит. Мера! Лучший способ сделать бенчмарки релевантными-сделать их максимально похожими на реальный вариант использования, который вас интересует. В идеале вы измеряете различные версии вашего фактического производственного кода.)

Чтение свойств имеет одинаковую скорость независимо от того, как свойство было определено.

Запись в существующие свойства должна быть всегда проверьте возможность записи именно потому, что он не может знать, был ли использован foo.bar = baz или Object.defineProperty(foo, "bar", {value: baz}). Так что это та же самая скорость.

Особой охраны нет.