2015-08-27 4 views
1

В этом reference, ниже код Javascript,Почему я устанавливаю Manager.prototype?

function Manager() { 
    Employee.call(this); 
    this.reports = []; 
} 
Manager.prototype = Object.create(Employee.prototype); 

для соответствующего кода Java.

public class Manager extends Employee { 
    public Employee[] reports = new Employee[0]; 
} 

Manager.prototype указан в вышеуказанном коде. Employee.prototype не установлен, как показано на рисунке reference.

function Employee() { 
    this.name = ""; 
    this.dept = "general"; 
} 

Если Employee свойства были добавлены в Manager явным вызовом Employee.call(this);, то почему мы должны установить Manager.prototype? Что содержит Employee.prototype?

Не могли бы вы прояснить проблему, если я не установил Manager.prototype в приведенном выше коде?

+0

Если вы хотите, чтобы в менеджере находились свойства Employee, вам нужно прототип Manager для получения свойств сотрудника. –

+0

@aug: вся ссылка на связанную страницу сравнивает модели прототипов на основе классов и прототипов. – Amadan

ответ

3
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, определяемого конструктором.

Так что, как правило, вы должны назначать в конструкторах вещи, которые различны для каждого экземпляра. Вы бы «наследовали» из прототипа (на самом деле не наследуйте, поскольку он не копируется, а каждый раз, когда вы пытаетесь его найти, просматриваете цепочку прототипов), то же самое для каждого экземпляра «класса».

+0

Но 'Employee.prototype' не имеет этих членов' name' и 'dept'. Конструктор 'Employee' имеет этих членов. – overexchange

+0

'Employee.prototype' предназначен для поиска вещей, которые' Employee' не определяет. 'Manager.prototype' предназначен для поиска материала, который' Manager' не определяет, и это фактический 'Employee', который был создан конструктором' Employee', и таким образом имеет эти свойства. (EDIT: даже если они не были добавлены путем явной привязки к конструктору 'Employee' из конструктора' Manager', как указано в RobG ниже) – Amadan

+0

@ overexchange - эти свойства добавляются конструктором * Employee *, следовательно, в * Менеджер * есть: 'Employee.call (this)', так что экземпляры * Manager * также имеют их. – RobG

2

Лучший способ понять объект яваскрипта собирается: www.objectplayground.com

введите этот код:

function Employee(id){ 
this.id = id; 
} 
Employee.prototype.getId = function(){ 
return this.id; 
} 

function Manager(){ 
this.reports = []; 
} 


this.manager = new Manager(); 

нажмите оценки.

Теперь после того как вы смотрите на прототип менеджера посмотреть, что происходит, когда вы добавляете эту строку:

Manager.prototype = Object.create(Employee); 

после того, как:

function Manager(){ 
this.reports = []; 
} 

Прототип менеджера в настоящее время экземпляр сотрудника, это означает, что у него есть свойства Employee.