Что делает эта часть кода?
Есть такой код:
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, я читал но не понял, хочу разобраться а не просто заучить определение. |
Цитата:
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 Цитата:
Рассмотрим пример, пусть есть функция 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, когда соответствующий объект будет создан. |
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. |