Так что это цепочка прототипов вашего сотрудника (и человек) без линии 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|
|------|
| *** |
Я думаю, что в классическом сценарии наследования вы скажете 'base (name)', когда 'имя' человека должно быть установлено через Employee' ctor' (при условии, что базовый класс имеет 'ctor', беря имя как строку). То же самое достигается здесь с наследованием прототипов ... – rt2800
Он повторно использует код конструктора Person и делает экземпляры конкретных экземпляров экземпляров конкретного экземпляра Person для создаваемого Employee. Забавно, что упомянутая вами книга не делает этого. Возможно, этот ответ может показать, почему вы должны это сделать: http://stackoverflow.com/a/16063711/1641941 – HMR