JavaScript Reflect.setPrototypeOf() — змінити прототип об'єкта


Метод Reflect.setPrototypeOf() змінює прототип уже створеного об'єкта.

автор: NagarD

Загальний опис

Технічно він працює. Практично — це одна з найповільніших операцій у мові.

Причина в тому, що рушій оптимізує об'єкти під припущення про їхню форму. Зміна прототипу на льоту руйнує всі ці оптимізації — і не лише для цього об'єкта, а для всього коду, що з ним працює.

Тому правильний шлях — задати прототип при створенні: через Object.create() або звичайний class.

автор: NagarD

Нотатка

Зміна прототипу на льоту вбиває продуктивність. У документації V8 це прямо названо антипаттерном. Якщо здається, що він потрібен — майже напевно потрібен Object.create().

автор: NagarD

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
setPrototypeOf 49+ 42+ 10+ 36+ 12+ -
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
setPrototypeOf 49+ yes yes 10+

Приклади

+ запропонувати свій приклад у пісочниці

Так робити не варто — і як треба.

const animal = { speak: () => console.log('звук') };
const dog = {};

// працює, але вбиває оптимізації рушія
Reflect.setPrototypeOf(dog, animal);
dog.speak();

// правильно — задати прототип ОДРАЗУ
const betterDog = Object.create(animal);
betterDog.speak();
автор: NagarD

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Пропозиція правки

Ваша версія — : після перевірки замінить чинну. Нова порада чи нотатка — з'явиться на сторінці після перевірки.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія секції «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія опису «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Зворотний зв'язок
Вхід