Показать сообщение отдельно
  #2 (permalink)  
Старый 22.05.2019, 06:17
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от nathan111777
У меня вопросы только по одной части кода: this.name = name;
0) Зависит от того, как была использована функция. Если как new User("Вася"), то this указывает на этот самый экземпляр класса User, который также можно назвать объектом, созданным при помощи конструктора User. Если как User("Вася"), то this указывает на глобальный объект.

1) Что делает эта часть кода? Создаёт у объекта свойство name со значением переменной name, переданной в качестве аргумента.

2) Зачем ключевое слово this? Что оно делает? Оно необходимо, чтобы можно было обратиться к ново-созданному объекту. Другими словами, ключевое слово this ссылается на текущий экземпляр класса.

3) Я так понимаю "name" слева от равно это параметр функции, а справа тогда что? Указано имя свойства, которое объявляется на текущем экземпляре класса.

Ваш код можно переписать с использованием синтаксиса класса вот так...
class User {
    constructor(name) {
        this.name = name;
    }

    hello(who) {
        console.log("Hello, " + who.name);
    }
}

var vasya = new User("Вася");
var petya = new User("Петя");

vasya.hello(petya);
petya.hello(vasya);


UPD
Сообщение от Malleys
Если как User("Вася"), то this указывает на глобальный объект.
Хотя это так и есть, нет необходимости это подчёркивать, поскольку здесь this работает точно также, как во всех остальных случаях.

Рассмотрим пример, пусть есть функция
function test() {
    return this;
}
Кто-то может считать, что это слишком сложно, нелогично, «волосы встают дыбом, когда узнаёшь, на что ссылается этот this»!

Функция test объявлена глобально, значит к ней можно обратиться так — window.test

Но что такое window? Глобальный объект. Это так и есть, но также он является представителем класса Window. Т. е. вы можете представить, что до любого кода было сделано объявление const window = new Window();

Когда мы позже объявили функцию test, мы по сути добавили метод test к объекту window. Совершенно правильно и логично, что this в таком методе указывает на window.

С другой стороны мы можем объявить функцию test путём добавления метода к классу Window:
Window.prototype.test = function test() {
    return this;
}
И тогда совершенно правильно и логично, что this в таком методе указывает на представителя класса Window, и в частности на window, когда соответствующий объект будет создан.

Последний раз редактировалось Malleys, 22.05.2019 в 06:53.
Ответить с цитированием