Прототипное наследование - это механизм наследования в JavaScript, который основан на прототипах объектов. В этом подходе каждый объект имеет ссылку на свой прототип, который определяет его свойства и методы. Когда свойство или метод не найден в самом объекте, JavaScript ищет его в его прототипе, и так далее вверх по цепочке прототипов, пока не будет найдено нужное свойство или метод или не будет достигнут конец цепочки прототипов (который заканчивается объектом Object.prototype
).
Прототипное наследование позволяет создавать объекты, которые наследуют свойства и методы от других объектов, что делает код более модульным и уменьшает дублирование кода.
// Наследование
const a = { prop: "Test" }; // Создаем объект a с свойством prop
const b = Object.create(a); // Создаем объект b, который наследует от a
const c = Object.create(b); // Создаем объект c, который наследует от b
console.log(b); // {}, объект b пуст, но наследует свойство prop от a
console.log(b.prop); // "Test", свойство prop наследуется от a
console.log(c); // {}, объект c пуст, но наследует свойство prop через цепочку прототипов
console.log(c.prop); // "Test", свойство prop наследуется через цепочку прототипов
// Объект с прототипом
const e = {}; // Создаем пустой объект e
console.log(e.toString); // function toString(), метод toString наследуется от Object.prototype
console.log(e.toString()); // [object Object], результат вызова метода toString
// Объект без прототипа
const f = Object.create(null); // Создаем объект f без прототипа
console.log(f.toString); // undefined, метод toString отсутствует, так как у объекта нет прототипа
console.log(f.toString()); // TypeError: f.toString is not a function, попытка вызвать несуществующий метод
Чтобы создать объект без прототипа в JavaScript, можно использовать функцию Object.create(null)
. Эта функция создает новый объект со своими собственными свойствами, но без прототипа. Например:
const objWithoutPrototype = Object.create(null)
objWithoutPrototype.foo = "bar"
console.log(objWithoutPrototype.foo) // 'bar'
console.log(objWithoutPrototype.toString) // undefined
В этом примере objWithoutPrototype
создается с помощью Object.create(null)
, что означает, что он не имеет прототипа. Свойство foo
устанавливается в этот объект, и его значение равно 'bar'
. Однако, когда мы пытаемся получить свойство toString
, мы получаем undefined
, потому что этот метод не наследуется от прототипа.