Что такое __proto__ и prototype?

Этот вопрос проверяет знание различий между свойствами __proto__ и prototype, а также понимание того, как они используются для создания и управления наследованием в JavaScript.

Короткий ответ

__proto__ — это скрытое свойство каждого объекта, которое ссылается на его прототип, позволяя наследовать свойства и методы. prototype — это свойство функций-конструкторов, которое определяет прототип для всех объектов, созданных с их помощью. Когда создаётся объект с помощью конструктора, он получает ссылку на прототип через свойство __proto__, а прототип этих объектов задаётся через свойство prototype конструктора.

Длинный ответ

В JavaScript есть два связанных, но разных понятия — __proto__ и prototype.

 

__proto__: Это скрытое внутреннее свойство, которое присутствует у каждого объекта. Оно ссылается на прототип объекта, от которого он наследует свойства и методы. Это свойство используется для реализации механизма прототипного наследования. Через него JavaScript определяет, к какому объекту обратиться, если требуемое свойство не найдено у самого объекта.

Например:

const obj = {}; 
console.log(obj.__proto__);  // Выведет Object.prototype

__proto__ можно использовать для динамического изменения цепочки прототипов, хотя это не считается хорошей практикой из-за потенциальных проблем с производительностью.

 

prototype: Это свойство функций-конструкторов, которое используется для определения прототипа всех объектов, созданных с помощью этого конструктора. Если вы создаёте объект через функцию-конструктор, его скрытое свойство __proto__ будет ссылаться на объект, который определён через prototype функции-конструктора.

 

Пример с использованием функции-конструктора:

function Animal() {} 

Animal.prototype.speak = function() {
    console.log('Animal speaks'); 
}; 

const dog = new Animal(); 
dog.speak(); // 'Animal speaks'

Здесь dog.__proto__ ссылается на Animal.prototype, что позволяет объекту dog наследовать метод speak.

 

Таким образом, __proto__ управляет ссылкой на прототип для любого объекта, тогда как prototype управляет тем, что будет установлено в качестве прототипа для объектов, создаваемых с помощью конструктора.

Уровень

  • Рейтинг:

    4

  • Сложность:

    9

Навыки

  • JavaScript

    JavaScript

Ключевые слова

Подпишись на React Developer в телеграм