Manager.prototype = Object.create(Employee.prototype);
является JavaScript способ достижения подобного результата, как в Java
Manager extends Employee
Без этой линии, Manager
не будет вести себя как другие Employee
с. В нем говорится: «Если вы не можете найти, как менеджер сделает что-то, тогда он сделает то же самое, что и работник». По умолчанию все классы Java наследуют от Object
; аналогично, все классы JavaScript имеют прототип по умолчанию. Точно так же, как вам не нужно говорить Employee extends Object
, вам не нужно явно назначать прототип Employee
.
EDIT для лучшего примера:
function Animal(name) {
this.name = name;
}
Animal.prototype.alive = true;
function Ursine(name, colour) {
Animal.call(this, name); // call superconstructor to handle initialisation
this.colour = colour;
}
Ursine.prototype = Object.create(Animal.prototype);
Ursine.prototype.sound = function growl() { console.log("Grrrr"); }
function PolarBear(name) {
Ursine.call(this, name, "white");
}
PolarBear.prototype = Object.create(Ursine.prototype);
var sheet = new PolarBear("Sheet");
sheet.name;
// Sheet
sheet.colour;
// white
sheet.sound();
// "Grrrr"
sheet.alive
// true
function Cat(colour) {
this.colour = colour;
}
Cat.prototype = Object.create(Animal.prototype);
Cat.prototype.sound = function meow() { console.log("meow"); }
var fluffy = new Cat("grey");
fluffy.alive
// true
fluffy.sound()
// "meow"
Здесь sheet
получает name
определяется Animal
конструктором, species
получает определяется Ursine
конструктор, sound
получает в наследство от прототипе PolarBear
, который представляет собой специфический Ursine
, который действует как архетип для всех белых медведей, а alive
наследуется от прототипического Животного.
Cat
не нуждается в имени (так как кошки такие классные), поэтому нам даже не нужно цепляться за конструктор Animal
- мы говорим, что мы сделаем все сами. sound
наследуется от прототипа Cat
, alive
от Animal
прототипа и colour
, определяемого конструктором.
Так что, как правило, вы должны назначать в конструкторах вещи, которые различны для каждого экземпляра. Вы бы «наследовали» из прототипа (на самом деле не наследуйте, поскольку он не копируется, а каждый раз, когда вы пытаетесь его найти, просматриваете цепочку прототипов), то же самое для каждого экземпляра «класса».
Если вы хотите, чтобы в менеджере находились свойства Employee, вам нужно прототип Manager для получения свойств сотрудника. –
@aug: вся ссылка на связанную страницу сравнивает модели прототипов на основе классов и прототипов. – Amadan