04

Прототипы и классы

Свойство ищется по цепочке. Новая ссылка на 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({...}), есть унаследованное свойство, но нет собственного ключа с этим именем.

  1. 4.1Мутация прототипа и замена ссылки
  2. 4.2super ищет метод, this остаётся экземпляром
  3. 4.3in, hasOwn и keys
  4. 4.4Два похожих имени у одной функции
  5. 4.5Объект, у которого нет прототипа
  6. 4.6Присваивание экземпляру мимо прототипа
  7. 4.7Старый экземпляр после подмены прототипа
  8. 4.8Кто печатает первым в цепочке классов
  9. 4.9Где живут статические методы и поля
  10. 4.10Геттер в классе против геттера в литерале
  11. 4.11Собственные ключи и вся цепочка
  12. 4.12Свой метод, дописанный массивам
  13. 4.13instanceof для числа и строки
  14. 4.14Где остановится поиск в цепочке из трёх звеньев

Задачи из сборки