Почему при перезаписи этого объекта на пустой объект, алер выводит 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 }, но сам объект останется, и другие ссылки на него тоже останутся.