Прототипы и классы
Свойство ищется по цепочке. Новая ссылка на prototype не переписывает старые объекты.
Свойство ищется не только на самом объекте. Если его там нет, поиск идёт по [[Prototype]] и дальше по цепочке — до null. Но чтение и присваивание устроены по-разному: присваивание пишет в сам объект, а не туда, где свойство нашлось.
Мутация прототипа и замена ссылки — разные вещи
- Изменение поля существующего прототипа видно всем экземплярам, потому что они смотрят на тот же объект.
Constructor.prototype = ...меняет ссылку только у конструктора. Уже созданные объекты продолжают смотреть на старый прототип, а новые получают новый.
function C() {}C.prototype.tag = "old";const inst = new C(); C.prototype = { tag: "new" }; inst.tag // "old" — ссылка взята при созданииnew C().tag // "new"inst instanceof C // false — прототип уже другойclass собирает ту же цепочку, просто синтаксисом. super.method() ищет метод на прототипе родителя, но this внутри остаётся экземпляром, у которого метод позвали.
Что видит проверка
in смотрит всю цепочку, включая унаследованное. Object.keys и Object.hasOwn — только собственные свойства объекта. Унаследованное в список ключей не попадает: поэтому у объекта, созданного через Object.create({...}), есть унаследованное свойство, но нет собственного ключа с этим именем.
- 4.1Мутация прототипа и замена ссылки
- 4.2super ищет метод, this остаётся экземпляром
- 4.3in, hasOwn и keys
- 4.4Два похожих имени у одной функции
- 4.5Объект, у которого нет прототипа
- 4.6Присваивание экземпляру мимо прототипа
- 4.7Старый экземпляр после подмены прототипа
- 4.8Кто печатает первым в цепочке классов
- 4.9Где живут статические методы и поля
- 4.10Геттер в классе против геттера в литерале
- 4.11Собственные ключи и вся цепочка
- 4.12Свой метод, дописанный массивам
- 4.13instanceof для числа и строки
- 4.14Где остановится поиск в цепочке из трёх звеньев
Задачи из сборки