Наследование конструкторов 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 ответов:
Проверьте следующий код:
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
отсылает обратно к этому менеджеру, а не к функции, в которой была записана строка.