Наследование конструкторов Javascript


Доброе утро в моем часовом поясе.

Я изучаю наследование JavaScript и начинаю читать страницы MDN. Я понимаю, что мы должны использовать свойство prototype из конструктора для построения цепочки наследования, например :

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

function Manager(){
 this.projects = [];
}
Manager.prototype = new Employee;

Если мы сделаем это:

var jane = new Manager();

Jane.name - > он будет повторять "Дэйв", потому что он найдет на объекте сотрудника.

Чего я не могу понять, если вы сделаете это таким образом:

 function Employee(name,dept){
 this.name = name || "Dave";
 this.dept = dept || "General";
}

function Manager(){
 this.base = Employee;
 this.base("Jack","CustpmDept");
 this.projects = [];
}

Теперь, если я сделаю то же самое :

var jane = new Manager();

Jane.name - > он будет повторно использовать "Джек", потому что он найдет на объекте сотрудника.

В этом последнем примере я не использовал линейный менеджер.прототип = новый сотрудник; И это все еще работает, объект менеджера имеет в качестве своего прототипа объект сотрудника. Как такое возможно ? Можете ли вы разъяснить мне

Заранее спасибо

С наилучшими пожеланиями

5 2

5 ответов:

Проверьте следующий код:

function Employee(name,dept){
    this.name = name || "Dave";
    this.dept = dept || "General";
    console.log(this instanceof Manager);
}

function Manager(){
     this.base = Employee;
     this.base("Jack","CustpmDept");
     this.projects = [];
}

var jane = new Manager();
console.log(jane.name);

В Примере

console.log(this instanceof Manager);

Возвращает true , потому что при вызове

this.base = Employee;

Вы в основном посылаете этого менеджера сотруднику . this.name и это.dept фактически прикреплены к менеджеру.

function Manager(){
    this.base = Employee;
    this.base("Jack","CustpmDept");
    this.projects = [];
}

Когда вы использовали this.base("Jack","CustpmDept"), in вызывает Employee с this внутри Employee, указывая на новый экземпляр менеджера

Второй способ похож на кражу конструктора. this.base("Jack","CustpmDept"); вызовет конструктор Employee, так как ключевое слово this будет указывать на объект, который будет создан, когда мы создадим экземпляр, поэтому Джейн может получить эти свойства.

В последнем случае new Manager() возвращает "Джек", потому что вы вызываете this.Employee('Jack', 'CustpmDept'), который устанавливает jane.name В "Джек", потому что " это " - "менеджер", или в данном случае "Джейн".

Это немного сбивает с толку.

Итак, js забавен тем, как он обрабатывает контекст.

Когда вы вызываете this.base() в конструкторе менеджеров, вы вызываете функцию base из контекста этого менеджера. Таким образом, к тому времени, когда мы добираемся до бита this.name =, ключевое слово this отсылает обратно к этому менеджеру, а не к функции, в которой была записана строка.