Что делает эта часть кода?
Есть такой код:
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, время: 01:06. |