Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Что делает эта часть кода? (https://javascript.ru/forum/misc/77568-chto-delaet-ehta-chast-koda.html)

nathan111777 21.05.2019 19:19

Что делает эта часть кода?
 
Есть такой код:
function User(name){
    this.name = name;
}

User.prototype.hello = function(who){
    console.log("Hello, " + who.name); };

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

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

У меня вопросы только по одной части кода: this.name = name;
1) Что делает эта часть кода?
2) Зачем ключевое слово this? Что оно делает?
3) Я так понимаю "name" слева от равно это параметр функции, а справа тогда что?

P.S.Прошу ссылки не бросать на книги или сайты по this, я читал но не понял, хочу разобраться а не просто заучить определение.

Malleys 22.05.2019 06:17

Цитата:

Сообщение от 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, когда соответствующий объект будет создан.

MallSerg 22.05.2019 11:15

this - это всегда ссылка на тот или иной объект
т.е. this.name это тоже самое что и ["какой то объект"].name

Во многих языках this это константный указатель на экземпляр класса т.е. он определяется в момент компиляции программы и после этого не изменяется
В JavaScript this вычисляется каждый раз когда вызывается функция и указывает он на объект в контексте которого исполняется функция.

Все данные в JavaScript хранятся в виде свойств объектов.
Функции не исключение вызов функции всегда обращение в свойству какого либо объекта а this указывает у какого объекта вызвана функция.

Даже если мы явно не привязываем переменную к какому то объекту интерпретатор сделает это за нас не явным способом. К примеру
function A (){
 alert("вызвана функция А");
};
window.A();


Оператор new приводит к тому что вместо обычного вызова функции происходит привязка контекста в котором вызывается функция
["Новый создоваемый объект"].constructor( параметры ...)

Грубо говоря this указывает на объект находящийся за точкой но точка не всегда явно видна в коде
т.к. функции в JS это объекты первого класса то они могут присваиваться любым свойствам объекта и т.к. объект в контексте которого вызвана функция изменился то и this будет изменен.

Небольшой пример

;
function GlobFunc (){
      alert(this.name) ;
};

A = {name:"Obj A", propertyLinkFunction: GlobFunc }; 
B = {name:"Obj B", propertyLinkFunction: GlobFunc };
C = {name:"Obj C", propertyLinkFunction: GlobFunc };

A.propertyLinkFunction ();
B.propertyLinkFunction ();
C.propertyLinkFunction ();


Часовой пояс GMT +3, время: 23:18.