Prototype - это объект, как и все остальное в JavaScript, и назначение объектов осуществляется по ссылке. Вы только что назначили новую птицу прототипу попугая, поэтому прототип попугая теперь является экземпляром птицы. И птичий конструктор - Птица.
Вы можете исправить это с помощью строки
Parrot.prototype.constructor = Parrot;
Другой способ сделать это - назначить клон прототипа Bird для Parrot.prototype
function deepClone(obj) {
var clone = {};
for(var i in obj) {
if(typeof(obj[i])==="object") {
clone[i] = deepClone(obj[i]);
} else {
clone[i] = obj[i];
}
}
return clone;
}
Parrot.prototype = deepClone(Bird.prototype);
Parrot.prototype.constructor = Parrot;
Я предпочитаю это, потому что:
1) это экономит создание произвольного экземпляра птицы (что, если что-то считает, если было создано много птиц)
2) Что, если конструктор Bird принял аргумент, который был проверен в теле конструктора? затем
вызов:
Parrot.prototype = new Bird();
может вызвать нулевой указатель