1

Я пытаюсь понять этот кусок кода и мне интересно, почему у нас есть вызов супер функции конструктора в суб «класс» функция-конструктор:Прототип наследования: Вызов супер конструктор в суб функция «класс» конструктор

function Person(name) { 
    this.name = name; 
} 
// Other properties on Person prototype here... 

function Employee(id, name) { 
    Person.call(this, name); // Why do we have to do this? 
    this.id = id; 
} 
Employee.prototype = Object.create(Person.prototype); 
// Other properties on Employee prototype here... 

1) Почему у нас есть Person.call(this, name)? В «Секретах Javascript Ninja» они делают prototype inheritance БЕЗ, вызывающий супер конструктор (остальная часть кода то же самое, кроме Object.create, но я понимаю, зачем это нужно).

+0

Я думаю, что в классическом сценарии наследования вы скажете 'base (name)', когда 'имя' человека должно быть установлено через Employee' ctor' (при условии, что базовый класс имеет 'ctor', беря имя как строку). То же самое достигается здесь с наследованием прототипов ... – rt2800

+0

Он повторно использует код конструктора Person и делает экземпляры конкретных экземпляров экземпляров конкретного экземпляра Person для создаваемого Employee. Забавно, что упомянутая вами книга не делает этого. Возможно, этот ответ может показать, почему вы должны это сделать: http://stackoverflow.com/a/16063711/1641941 – HMR

ответ

3

Так что это цепочка прототипов вашего сотрудника (и человек) без линии Person.call(this,name):

|Person|      |Employee| 
|------|      |--------| 
|name |      |wage | 
|sex |      |id  | 

    |        | 
    |        | 
    v        v 

|Person Prototype|    |Employee Prototype| 
|----------------|    |------------------| 
|walk()   | <-------- |work()   | 
|eat()   |    |goOnStrike()  | 
|sleep()   | 

    | 
    | 
    v 

|Object| 
|------| 
| *** | 

Каждый раз, когда вы запрашиваете собственность работника, JavaScript ищет это свойство, путешествуя вниз прототип цепь. Если вы пишете это:

var employee = new Employee(1, "Jack White"); 
employee.walk(); 

JavaScript будет выглядеть в employee, чем в employee.[[prototype]], а затем в employee.[[prototype]].[[prototype]] (следуя указаниям стрелок на диаграмме), пока он не найдет свойство walk.

Как вы можете видеть, если вы запрашиваете свойство name, JavaScript его не найдет, поскольку он не находится в цепочке прототипов employee. Поэтому вам нужно убедиться, чтобы также «скопировать» местные свойства, такие как name и sex.

Вы можете сделать это с помощью вызова конструктора Person с контекстом текущего Employee:

function Employee(id, name) { 
    Person.call(this, name); 
    this.id = id; 
} 

, который делает по существу то же самое, как если бы вы просто скопировать весь код внутри конструктора Person в конструктор сотрудников:

function Employee(id, name) { 
    this.name = name; //copied from Person 
    this.id = id; 
} 

Это приводит к следующей настройке и работник с имуществом имя:

|Person|      |Employee| 
|------|      |--------| 
|name |      |wage | 
|sex |      |id  | 
           |name | 
           |sex  | 

    |        | 
    |        | 
    v        v 

|Person Prototype|    |Employee Prototype| 
|----------------|    |------------------| 
|walk()   | <-------- |work()   | 
|eat()   |    |goOnStrike()  | 
|sleep()   | 

    | 
    | 
    v 

|Object| 
|------| 
| *** | 
+0

Очень подробный ответ. Хотя ответа Джо достаточно, я считаю, что это лучшее объяснение для людей, новых для наследования JS. –

+0

Я согласен. Это ответ на вопрос. –

2

Невыполнение конструктора супер означает, что подкласс имеет некоторое представление о поведении суперкласса: это противоположность инкапсуляции. Он не должен знать, нуждается ли родительский класс или не нуждается в какой-либо «установке» в своем конструкторе. Чтобы быть в безопасности, он должен просто называть его и продолжать.

Например, если персоналу всегда приходилось инициализировать кучу свойств при создании экземпляра, а Employee не сделал вызов конструктора Person, операции экземпляра сотрудника, которые полагаются на свойства/методы Person, могут не работать должным образом.

Смежные вопросы