Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.05.2019, 19:19
Аспирант
Отправить личное сообщение для nathan111777 Посмотреть профиль Найти все сообщения от nathan111777
 
Регистрация: 12.05.2019
Сообщений: 44

Что делает эта часть кода?
Есть такой код:
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, я читал но не понял, хочу разобраться а не просто заучить определение.
Ответить с цитированием
  #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.
Ответить с цитированием
  #3 (permalink)  
Старый 22.05.2019, 11:15
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,138

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 ();
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объясните данную часть кода пожалуйста... fizz5360 Общие вопросы Javascript 2 26.10.2018 12:32
скрыть из исходного кода часть javascript кода. javasc Javascript под браузер 10 12.03.2014 09:32
Как убрать одну часть кода и добавить другую? hurricane Элементы интерфейса 2 30.12.2010 18:09
Что делает .function(e)? savenko jQuery 1 03.07.2010 15:29
Что делает этот скрипт? Wallkost Оффтопик 4 19.03.2010 14:54