2016-08-23 3 views
1

Прошел через Mozilla's Reference и наткнулся на это простое отношение.Javascript Inheritance call behavior

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

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

Видимо, это создает отношения, связанные с наследованием от Работника к Менеджменту.

Два вопроса здесь, не уверен, что и почему Employee.call(this); там и вместо присвоения объекта Employee.prototype он присвоенные Manager.prototype. Мои мысли заключались в том, что Менеджер наследует от Employee, а не наоборот. Возможно, это концепция прототипной цепи, где это действительно означает, что оба объекта могут захватывать свойства друг от друга?

Хотелось бы уточнить.

+0

Менеджер наследует свойства класса Employee и также будет иметь свои собственные свойства/методы. Однако класс Employee не будет наследовать свойства Менеджера. –

+0

"* вместо назначения объекта' Employee.prototype' * "- какой объект? – Bergi

+0

@Bergi 'Employee.prototype = Object.create (Manager.prototype);' – Aaron

ответ

2
  1. Employee.call(this) это как вызов Employee(), но вместо того, чтобы использовать его, чтобы создать новый объект, вместо этого он изменяет текущую Manager. В этом примере он устанавливает name и dept в Manager.
  2. Это утверждение:

    Manager.prototype = Object.create(Employee.prototype); 
    

    означает, что все атрибуты, установленные как Employee.prototype.x = val также будут доступны в Manager.prototype; однако, если вы переопределите их в Manager.prototype, они будут переопределены.
    Вы также должны запустить Manager.prototype.constructor = Manager, чтобы исправить эту ошибку.

+0

Можно ли думать о 'Employee.call (this)' as 'super()' в Java? – Aaron

+0

Я думаю, что это похоже. (Я не знаю Java, хотя). –

+0

@ Аарон: Да, это именно то, что он делает. Он вызывает родительский конструктор на дочернем экземпляре для создания и инициализации родительских свойств. – Bergi