Создание и прототипы объектов

Создание и прототипы объектов

Технический фундамент прототипной модели

Каждый объект в JavaScript связан с прототипом.
Поиск свойства идет по цепочке: сначала сам объект, затем его прототип, затем прототип прототипа и так далее.

const proto = { kind: 'base' };
const obj = Object.create(proto);

console.log(obj.kind); // base
console.log(obj.hasOwnProperty('kind')); // false

Ключевой момент: унаследованное свойство доступно так же, как собственное, но хранится в другом месте цепочки.

Создание объекта

const user = {
  name: 'Ann',
};

Можно создавать и через Object.create(proto).

const personProto = {
  greet() {
    return `Hi, ${this.name}`;
  },
};

const person = Object.create(personProto);
person.name = 'Max';

console.log(person.greet()); // Hi, Max

Где искать свойство

console.log(person.name); // собственное свойство
console.log(person.greet); // взято из прототипа

Проверь себя: что произойдет, если добавить greet прямо в person?

Подсказка: собственное свойство перекроет (shadow) унаследованное из прототипа.

person.greet = function () {
  return `Hello, ${this.name}`;
};

console.log(person.greet()); // Hello, Max

Проверка собственных свойств

console.log(person.hasOwnProperty('name')); // true
console.log(person.hasOwnProperty('greet')); // false

Это помогает отличать собственные поля от унаследованных.

Object.getPrototypeOf

const proto = Object.getPrototypeOf(person);
console.log(proto === personProto); // true

Микро-сценарии

  1. Общие методы для объектов одного типа через общий прототип.
  2. Экономия памяти: метод хранится один раз в прототипе, а не в каждом объекте.

Типичные ошибки

  • Путать собственные и унаследованные свойства.
  • Менять прототипы без необходимости.
  • Делать слишком длинную прототипную цепочку.
  • Не понимать, откуда «вдруг» появился метод.

Анти-провал: сначала проверяй hasOwnProperty, если логика зависит именно от собственных данных.

Краткий итог

  • Объекты в JS работают через прототипы.
  • Object.create создает объект с заданным прототипом.
  • Поиск свойств идет по цепочке: объект → прототип.
  • hasOwnProperty и Object.getPrototypeOf помогают диагностировать структуру.
  • Понимание прототипов упрощает работу с классами и наследованием.