Создание и прототипы объектов
Создание и прототипы объектов
Технический фундамент прототипной модели
Каждый объект в 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
Микро-сценарии
- Общие методы для объектов одного типа через общий прототип.
- Экономия памяти: метод хранится один раз в прототипе, а не в каждом объекте.
Типичные ошибки
- Путать собственные и унаследованные свойства.
- Менять прототипы без необходимости.
- Делать слишком длинную прототипную цепочку.
- Не понимать, откуда «вдруг» появился метод.
Анти-провал: сначала проверяй hasOwnProperty, если логика зависит именно от собственных данных.
Краткий итог
- Объекты в JS работают через прототипы.
Object.createсоздает объект с заданным прототипом.- Поиск свойств идет по цепочке: объект → прототип.
hasOwnPropertyиObject.getPrototypeOfпомогают диагностировать структуру.- Понимание прототипов упрощает работу с классами и наследованием.