@antpv

Почему этот код работает именно так?

Я правильно понимаю? При создании rabbit, в его __proto__ будет записана ссылка на объект Rabbit.prototype?
function Rabbit() {}
Rabbit.prototype = {
  eats: true
};

var rabbit = new Rabbit();

Rabbit.prototype = {}; //*

alert( rabbit.eats );

Почему при перезаписи этого объекта на пустой объект, алер выводит true? ведь __proto__ ссылаеться на уже пустой объект

function Rabbit(name) {}
Rabbit.prototype = {
  eats: true
};

var rabbit = new Rabbit();

Rabbit.prototype.eats = false;

alert( rabbit.eats );


А в этом моменте, мы просто меняем свойство объекта на который ссылается __proto__ rabbit, и все работает как нужно. (выводит false)

Так в чём разница?
  • Вопрос задан
  • 175 просмотров
Решения вопроса 1
Vlad_IT
@Vlad_IT Куратор тега JavaScript
Front-end разработчик
Почему при перезаписи этого объекта на пустой объект, алер выводит true? ведь __proto__ ссылается на уже пустой объект

При создании объекта через конструктор, копируется ссылка на объект из prototype в __proto__. В этом коде получается, что у rabbit __proto__ равен ссылке на объект { eats: true }, он больше не зависит от Rabbit.prototype. Но если вы создадите еще раз объект через конструктор, то его __proto__ будет равным {}
А в этом моменте, мы просто меняем свойство объекта на который ссылается __proto__ rabbit, и все работает как нужно. (выводит false)

Да, т.к. и __proto__ и prototype ссылаются на один и тот же объект, вот так яснее.
var obj = {
  eats: true
}
function Rabbit(name) {}
Rabbit.prototype = obj 

var rabbit = new Rabbit();

alert(Rabbit.prototype == obj); // true 
alert(rabbit.__proto__ == obj); // true
alert(rabbit.__proto__ == Rabbit.prototype); // true, т.к. у обоих ссылка на один и тот же объект.

Даже если вы напишите obj = null, вы просто удалите из переменной obj ссылку на объект { eats: true }, но сам объект останется, и другие ссылки на него тоже останутся.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы