Muranx
@Muranx
кто понял this тот в цирке не смеётся

На что в данном случае указывает this?

Здравствуйте!
function A(name, age){
  this.name=name;
  this.age=age;
};

var b = new A("Alex", 25);

document.write(b.name+"<br>"+b.age+"<br><hr>");

function Dev(name, age, skills){
  A.apply(this, arguments); //  ! ! ! ВОТ ИНТЕРЕСУЮЩИЙ ФРАГМЕНТ КОДА ! ! !
  this.skills = skills || [];
};

var c = new Dev("Sam", 35, ["Coocing"]);

document.write(c.name+"<br>"+c.age+"<br>"+c.skills+"<br><hr>");



Собственно я понимаю, что A.apply(this, arguments)при вызове в конструкции var c = new Dev( . . . ) будет указывать на объект c НО почему, когда я принудительно указываю например A.apply(c, arguments) результатом возвращается undefined! Смею предположить, что во время выполнения конструкции . . . new Dev( . . . ) интерпритатор ещё не знает про объект c? Или дело в чём то другом?
  • Вопрос задан
  • 143 просмотра
Пригласить эксперта
Ответы на вопрос 3
@GrayHorse
Это вызов контруктора родительского класса.
Не нашел на обновленном learn.javascript.ru этот способ организации наследования, ссылка на архивную версию статьи: web.archive.org/.../learn.javascript.ru/class-inhe...
Ответ написан
Xuxicheta
@Xuxicheta
инженер
Смею предположить, что во время выполнения конструкции . . . new Dev( . . . ) интерпритатор ещё не знает про объект c?

Во время выполнения вашего new переменная c объявлена, но не проинициализирована, и ее значение undefined
Присвоение ей значения произойдет после того как отработает правая часть выражения, после знака присваивания.

Это происходит из-за поднятия объявлений переменных через var.
А поскольку function Dev у вас в том же скоупе, то c попадает в нее через замыкание.
Ответ написан
TrueBlackBox
@TrueBlackBox
Постараюсь объяснить. Смотрите, есть функция Dev. Она принимает аргументы, и с ними делает всякое. В момент, когда вы делаете:
var c = new Dev("Sam", 35, ["Coocing"]);
что происходит? Создается новая функция Dev, она принимает те аргументы что вы в неё вложили, и результат выполнения этой функции попадает в переменную с. В итоге, переменная с становится объектом, { age: 35, name: "Sam", skills: Array [ "Coocing" ] }. this в даном случае вызывается не на переменную с, а на функцию new Dev, что вы вызываете.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы