Для чего необходимо ключевое слово this
Перейти к содержимому

Для чего необходимо ключевое слово this

  • автор:

Ключевое слово this в C++

Ключевое слово this в языке программирования C++ представляет указатель на текущий объект данного класса. Таким образом, через this мы сможем обратиться внутри класса к любым членам этого класса.

1-1801-30e499.png

В нашем примере определен класс Point, представляющий точку на плоскости. Для того чтобы хранить координаты этой точки, в классе определены переменные x и y.

Так вот, чтобы обращаться к этим переменным, применяется указатель this. При этом после this надо ставить не точку, а стрелку -> .

Однако в большинстве ситуаций вам вряд ли понадобится ключевое слово this для обращения к членам класса. Зато this может быть необходим в том случае, когда параметры функции либо переменные, определяемые внутри функции, называются точно так же, как и переменные класса. Допустим, this применяют, чтобы разграничить параметры и переменные класса в конструкторе.

Кроме того, используя this, вы сможете возвращать текущий объект класса:

2-1801-68c196.png

В примере выше метод move возвращает посредством this ссылку на объект текущего класса, выполняя условное перемещение точки. В результате появляется возможность осуществлять вызов метода move по цепочке для одного и того же объекта:

3-1801-5782c9.png

Тут следует отметить, что возвращается не просто объект Point, а ссылка на этот объект. То есть строка, определенная выше, по сути, будет аналогично следующему коду:

4-1801-fcff77.png

Но что было бы, если бы метод move возвращал не ссылку, а просто объект?

5-1801-584269.png

В таком случае вызов p1.move(10, 5).move(10) был бы по факту эквивалентен коду ниже:

6-1801-d1b08e.png

То есть второй вызов метода move вызывался бы в целях создания временной копии, следовательно, он бы никак не затрагивал переменную p1.

Java ключевое слово this, как работает?

Я знаю разные ситуации в которых можно использовать ключевое слово this в Java. Но одно определение мне до сих пор непонятно «ссылка на текущий обьект», на какой текущий?
Что если в классе не создано обьектов?
И самое главное, что если в классе несколько обьектов?
Какой из них «текущий»?

Я читал в одной статье что при создании класса неявно создаётся обьект класса, именно this на него и ссылается. Но тогда слово this не может заменять обьект при вызове переменной обьекта, по типу object.variable тоже самое что this.variable, но как это возможно? Ведь this указывает на некий обьект который мы не создавали. Кароче это определение совсем не ясное «текущий обьект».

ПС — Также не совсем понятно его использование (this и super) для вызова из одного конструктора другого, ни разу в жизни не пригодилось, и даже не могу представить ситуацию в которой такое может пригодится.

ПСС — Перечитал кучу статей, книг, видео, так и не понял сути «текущий обьект» так как не понятно что за обьект и что делать если обьектов нет или их несколько.

  • Вопрос задан более трёх лет назад
  • 11001 просмотр

2 комментария

Простой 2 комментария

Сергей Горностаев @sergey-gornostaev Куратор тега Java
Какие именно книги вы читали?

Также не совсем понятно его использование (this и super) для вызова из одного конструктора другого, ни разу в жизни не пригодилось, и даже не могу представить ситуацию в которой такое может пригодится.

super нужен для обращения к родительскому инстансу или родительскому конструктору. Если у вас будет иерархия классов (тем более — сложная), то поймёте, зачем нужны эти слова.
А по поводу объектов и слова this. Почитайте, например, Head First Java. Там довольно понятные рисунки. Каждый объект — это, по сути, дом, созданный по некоторому чертежу. В данном случае чертёж — это класс. Дома строятся на некоторой площади. Эта площадь — это куча объектов. При создании объекта (постройки дома) ему присваивается некоторый адрес (если брать аналогию с домами, то это улица и номер дома), адрес в куче. Он сохраняется внутри этого объекта (опять-таки, если брать аналогию с домом — то это табличка на доме с его адресом). Дальше можно привести такую аналогию. В каждый дом и в какое-либо его помещение может войти любой человек. Программа также входит в методы объектов. То есть в данном случае, программа — это этот человек, а метод — это комната дома, куда он вошёл. Соответственно, перед тем, как войти, человек смотрит номер дома, и запоминает его. И когда этот человек что-то делает внутри комнаты и видит где-то упоминание этого дома, он вспоминает, какой адрес этого дома и автоматически его использует, подставляет. Также делает и программа, когда идёт по телу методу. Понятно?

Решения вопроса 0
Ответы на вопрос 4

GavriKos

У вас путаница с терминами. Класс — это всего лишь «инструкция», «схема». Просто описанный в коде класс ничего не может делать. Чтобы он что то делал — нужно создать объект класса. Это делается явно через new.
Возьмем пример — ручка. У вас есть описание класса ручка. Но это еще не объект — всего лишь описание. Сделав New — вы создадите экземпляр ручки. И экземпляров может быть сколько угодно, и с разными параметрами (цвет, размер и прочее) — но все это ручки.

Так вот. this в ЭКЗЕМПЛЯРЕ указывает НА ЭТОТ САМЫЙ экземпляр.

Ответ написан более трёх лет назад
Нравится 4 17 комментариев
Сергей Горностаев @sergey-gornostaev Куратор тега Java

С ручками аналогия не очень понятная. Для класса лучше подойдёт аналогия архитектурного проекта здания. Проект один, а зданий наклепать по нему можно множество. В проекте жить нельзя, а в построенном здании можно. А ключ от дома в руке его владельца — это this, у каждого свой.

GavriKos

Сергей Горностаев, о, да, ваш пример лучше )

redasya

redasya @redasya Автор вопроса

GavriKos, Какой этот самый? Ручек может быть миллион. Также вы не правы, можно написать софт без единого обьекта и слова «new», в чём проблема то?

redasya

redasya @redasya Автор вопроса

Сергей Горностаев, Если this у каждого свой, термин «текущий обьект», не имеет смысла, если у класса 10000000 обьектов зданий, на какой обьект укажет this? Я же чётко поставил вопрос.

GavriKos

redasya, Для каждой ручки this укажет именно на эту ручку. Написать без new можно, но тогда не будет объекта класса и соответственно — не будет this.

е имеет смысла, если у класса 10000000 обьектов зданий,

проиллюстрируйте это кодом.

redasya

redasya @redasya Автор вопроса

GavriKos, Ну не 1000000 а скажем 2 обьекта, на какой укажет this? Именно на эту, на которую из них? Как компилятор это поймёт? Силой мысли? Да причём тут код, вот есть класс Person и есть два обьекта Vasya и Petya, и какой из них «текущий обьект»?!

GavriKos

redasya, у васи this — вася, у пети this — петя. this — это поле класса. Соответственно в каждом экземпляре оно свое.

GavriKos

redasya, именно поэтому НЕ создавая объект — this не будет указывыть никуда — его просто не будет. Поля класса не существует без экземпляра.

Сергей Горностаев @sergey-gornostaev Куратор тега Java

class DumbExample < private int value; public void revealTheMystery(int someValue) < this.value = someValue; >public static void main(String args[]) < DumbExample obj1 = new DumbExample(); DumbExample obj2 = new DumbExample(); obj1.revealTheMystery(42); // В этом вызове метода this указывает на obj1 obj2.revealTheMystery(666); // В этом вызове метода this указывает на obj2 >>

redasya

redasya @redasya Автор вопроса

Сергей Горностаев, Это не тот вариант. Тут указывается на поле обьекта, я говорю именно про указание на «текущий обьект».

Сергей Горностаев @sergey-gornostaev Куратор тега Java
redasya, что-нибудь поменялось?

public void revealTheMystery()

redasya

redasya @redasya Автор вопроса

GavriKos, Вы не понимаете очём я, я не про поля класса, про поля класса всё понятно.
he various usage of keyword Java ‘THIS’ in Java is as per the below,

It can be used to refer current class instance variable — Это поля
It can be used to invoke or initiate current class constructor
It can be passed as an argument in the method call
It can be passed as argument in the constructor call
It can be used to return the current class instance — Вот это непонятно

Сергей Горностаев @sergey-gornostaev Куратор тега Java
redasya, ок, ничего принципиально не меняется

public DumbExample revealTheMystery()

GavriKos

redasya, это все про один и тот же this. Щас попробуем с другой стороны. Все классы в Java — наследники (неявные) класса Object. У класса Object есть поле — this. Обычное поле класса. Соответственно оно есть и у наследников. Когда вы создаете экземпляр класса (делаете new) — джава-машина в поле this кладет ссылку на то, что было создано при помощи new.
Например:

YourClass instance = new YourClass(); YourClass instance2 = new YourClass();

в instance как вы понимаете — экземпляр класса YourClass и в instance2 — тоже экземпляр, но другой. Это два разных экземпляра (объекта). Соответственно их поля могут иметь разные значения. this — поле. Для instance — оно будет равно instance, для Instance2 — instance2.
Соответственно когда вы будете вызывать у какого то ЭКЗЕМПЛЯРА (методы вызываются у экземпляров, не у классов), то можете работать внутри метода только с полям этого ЭКЗЕМПЛЯРА. И вот в поле this будет ссылка на этот экземпляр, у которого вызван метод.
Продолжая код:

instance.someField = 1; instance2.someField = 2; public int YourClass::GetField()

Если вы попытаетесь вызвать метод GetField у instance — вернется 1. Если у instance2 — вернется 2. Вот точно так же и с this:

public YourClass YourClass::GetThis() < return this; >instance == instance.GetThis() //true instance2 == instance2.GetThis() //true instance == instance2.GetThis() //false

КОд не на джаве, но принцип тот же
Денис Загаевский @zagayevskiy Куратор тега Java
GavriKos, в какой момент this стал полем?

GavriKos

Денис Загаевский, это попытка объяснить на пальцах. Тут уж не до терминов )
Денис Загаевский @zagayevskiy Куратор тега Java
GavriKos, человек не понимает концепцию создания экземпляра класса, а вы ему про поля в обжекте.

Похоже тут никто из комментаторов понятия не имеют, как на самом деле работает их код.

Вы пишите такой код:

class Foo < void foo(String str) < . >; > . Foo f = new Foo(); f.foo("abc");

Компилятор же сгенерирует байткод, который примерно соответствует такому коду:

class Foo < static void foo(Foo this, String str) < . >; > . Foo f = new Foo(); Foo.foo(f, "abc");

this — это неявный первый параметр любого нестатического метода класса. У какого объекта вы метод вызываете, тот и будет передан в качестве параметра this.

Так что по сути this это не обычное ключевое слово, это просто имя параметра в методе.

Ответ написан более трёх лет назад
Комментировать
Нравится 2 Комментировать

Sputterspark

Elmo Sputterspark @Sputterspark

Методы всегда вызываются у объектов, а не классов, если они не статические. Вот на тот объект, у которого вызван метод, this и ссылается.

Ответ написан более трёх лет назад

redasya

redasya @redasya Автор вопроса

«если они не статические» Кагбы сами сказали))) Фэйспалм тут не к чему, класс и обьект это ни одно и тоже, почему то в большинстве статей это считается одним и тем же. Я кажется задал другой вопрос, какой обьект? У класса может быть 100000 обьектов, на который из них ссылается this?

redasya

redasya @redasya Автор вопроса

Вы же понимаете что можно и не создавать обьект и никто тебе руки не отрубит, тогда на что будет указывать this? И на что он будет указывать, если обьектов класса миллион? на который из них?

Sputterspark

Elmo Sputterspark @Sputterspark

redasya, если не создавать объект, то this не на что не будет указывать, его просто не существует в статическом контексте. А если объектов класса миллион, то будет указывать на тот, метод которого вызван. Фейспалм тут очень даже причём.

redasya, если будет триллион объектов одного класса, то у каждого объекта будет свой this.
Вот такая аналогия — есть тысяча абсолютно одинаковых людей (клонов). У каждого есть переменная «я». Каждый может сказать «я» только про самого себя, но не про другого человека, так как «я» у каждого своя.

redasya

redasya @redasya Автор вопроса

Артём Петренков, «на тот, у которого вызвали метод» — пример дайте. Я не понимаю какой обьект текущий и как это определяется, в классе может быть несколько обьектов.

redasya

redasya @redasya Автор вопроса

Артём Петренков,
he various usage of keyword Java ‘THIS’ in Java is as per the below,

It can be used to refer current class instance variable
It can be used to invoke or initiate current class constructor
It can be passed as an argument in the method call
It can be passed as argument in the constructor call
It can be used to return the current class instance — Вот это!

redasya, ну если хотите подробностей про внутренности, то при вызове метода у объекта, например, m.setPage(10), вызывается метод у класса, M.setPage(m, 10), первым параметром передаётся ссылка на этот объект. Собственная переменной this и присваивается значение ссылки на этот объект

jamakasi666

Дмитрий Александров @jamakasi666 Куратор тега Java
Просто IT’шник.

Если я правильно настроился на волну тс то разжую доступными словами.
Для начала нужно чтобы было правильное понимание происходящего в java а именно:
1) в java всё есть объект, вот прям все все* . Это означает что абсолютно что угодно отнаследовано от класса Object
2) есть(могут быть) различия того что именно содержится в классе в исходном коде и коде при выполнении программы а также после ее компиляции. Если простым языком то это может предстать так
— в коде у класса есть только метод foo()
— после компиляции оказывается что в нем после некоторых событий типа аннотаций появляется еще и метод bar(). Тут важно то что он появится * у всех инстансов от этого класса
— при выполнении может оказаться так что метод foo() будет подменен другим кодом. Это уже рефлексия.
— при выполнении может оказаться что у НЕКОТОРЫХ инстансов класса внутри окажется еще и метод mymethod(). Т.е. не у всех а именно у некоторых инстансов.
3) при выполнении программы * для абсолютно всего ВСЕГДА создается явно или не явно инстанс, даже для статического класса. Т.е. ты в коде может и не создавал инстанс явно через new, это было сделано рантаймом гдето в недрах явы!
4) статический класс отличается от обычного только тем что статический всегда указывает только и только* на 1 единственный инстанс
5) super() , означает что будет вызов метода\конструктора РОДИТЕЛЯ
6) super , БЕЗ СКОБОК, означает переход к переменным РОДИТЕЛЯ. Также можно вызвать и метод РОДИТЕЛЯ.
7) this всегда указывает именно на текущий инстанс класса. Другими словами представь что класс это область видимости и когда ты пишешь this ты явно говоришь что это относится именно к этому инстансу а не классу.

*гуру молчите что это не совсем так в особенных фундаментальных моментах
инстанс — экземпляр класса, т.е. грубо говоря он создается через new явно или не явно

Если всеравно непонятно то могу набросать примером простеньких. Также рекомендую почитать
это и примеры тут

Обобщая выше сказанное(с нюансами):
— в java ВСЁ и ВСЕГДА это инстанс какого либо класса
— исходя из пункта выше ВСЕГДА на любой класс существует хотябы один инстанс
— исходя из пункта выше часто бывают случаи когда необходимо обратиться к переменной\методу родителя через super. Также возникают необходимости обратиться к методу\переменной именно этого конкретного инстанса или передать этот инстанс куда либо дальше не имея ссылки на этот инстанс.

Использование ключевого слова «this» в Java

Одной из основных особенностей языка программирования Java является его объектно-ориентированный подход. Это означает, что большую часть кода мы пишем внутри классов, которые представляют собой модели объектов реального мира или абстракций. Внутри этих классов мы определяем переменные (состояния объектов) и методы (поведение объектов).

Ключевое слово this в Java используется для ссылки на текущий объект. Другими словами, this ссылается на экземпляр класса, внутри которого оно используется.

public class Car < private String color; public Car(String color) < this.color = color; >>

В этом примере this.color означает цвет текущего объекта Car , а color — это параметр конструктора. Без использования this переменная color в конструкторе ссылается на себя, а не на переменную класса.

Точно так же ключевое слово this можно использовать для вызова методов текущего объекта. Это может быть полезно, если есть необходимость уточнить, что метод должен быть вызван именно для текущего объекта.

public class Car < private int speed; public void increaseSpeed() < this.setSpeed(this.speed + 10); >private void setSpeed(int speed) < this.speed = speed; >>

В данном случае this.setSpeed() вызывает метод setSpeed() для текущего объекта Car .

Если же мы просто напишем setSpeed() , то это будет то же самое, что и this.setSpeed() , поскольку по умолчанию все методы вызываются для текущего объекта.

Итак, ключевое слово this в Java используется для указания на текущий объект в контексте класса. Это особенно полезно, когда есть необходимость различать между переменными класса и параметрами метода или конструктора с одинаковыми именами.

Ключевое слово this в JavaScript для начинающих

Автор материала, перевод которого мы сегодня публикуем, говорит, что когда она работала в сфере бухучёта, там применялись понятные термины, значения которых легко найти в словаре. А вот занявшись программированием, и, в частности, JavaScript, она начала сталкиваться с такими понятиями, определения которых в словарях уже не найти. Например, это касается ключевого слова this . Она вспоминает то время, когда познакомилась с JS-объектами и функциями-конструкторами, в которых использовалось это ключевое слово, но добраться до его точного смысла оказалось не так уж и просто. Она полагает, что подобные проблемы встают и перед другими новичками, особенно перед теми, кто раньше программированием не занимался. Тем, кто хочет изучить JavaScript, в любом случае придётся разобраться с this . Этот материал направлен на то, чтобы всем желающим в этом помочь.

Что такое this?

Предлагаю вашему вниманию моё собственное определение ключевого слова this . This — это ключевое слово, используемое в JavaScript, которое имеет особое значение, зависящее от контекста в котором оно применяется.

Причина, по которой this вызывает столько путаницы у новичков, заключается в том, что контекст this меняется в зависимости от его использования.

This можно считать динамическим ключевым словом. Мне нравится, как понятие «контекст» раскрыто в этой статье Райана Морра. По его словам, контекст всегда является значением ключевого слова this , которое ссылается на объект, «владеющий» кодом, выполняемым в текущий момент. Однако, тот контекст, который имеет отношение к this , это не то же самое, что контекст выполнения.

Итак, когда мы пользуемся ключевым словом this , мы, на самом деле, обращаемся с его помощью к некоему объекту. Поговорим о том, что это за объект, рассмотрев несколько примеров.

Ситуации, когда this указывает на объект window

Если вы попытаетесь обратиться к ключевому слову this в глобальной области видимости, оно будет привязано к глобальному контексту, то есть — к объекту window в браузере.

При использовании функций, которые имеются в глобальном контексте (это отличает их от методов объектов) ключевое слово this в них будет указывать на объект window .

Попробуйте выполнить этот код, например, в консоли браузера:

console.log(this); // в консоль выводится объект Window // Window < postMessage: ƒ, // blur: ƒ, // focus: ƒ, // close: ƒ, // frames: Window, …>function myFunction() < console.log(this); >// Вызовем функцию myFunction(); // функция выводит тот же объект Window! // Window < postMessage: ƒ, // blur: ƒ, // focus: ƒ, // close: ƒ, // frames: Window, …>

Использование this внутри объекта

Когда this используется внутри объекта, это ключевое слово ссылается на сам объект. Рассмотрим пример. Предположим, вы создали объект dog с методами и обратились в одном из его методов к this . Когда this используется внутри этого метода, это ключевое слово олицетворяет объект dog .

var dog = < name: 'Chester', breed: 'beagle', intro: function()< console.log(this); >>; dog.intro(); // в консоль выводится представление объекта dog со всеми его свойствами и методами // // breed:"beagle" // intro:ƒ () // name:"Chester" // __proto__:Object

This и вложенные объекты

Применение this во вложенных объектах может создать некоторую путаницу. В подобных ситуациях стоит помнить о том, что ключевое слово this относиться к тому объекту, в методе которого оно используется. Рассмотрим пример.

var obj1 = < hello: function() < console.log('Hello world'); return this; >, obj2: < breed: 'dog', speak: function()< console.log('woof!'); return this; >> >; console.log(obj1); console.log(obj1.hello()); // выводит 'Hello world' и возвращает obj1 console.log(obj1.obj2); console.log(obj1.obj2.speak()); // выводит 'woof!' и возвращает obj2

Особенности стрелочных функций

Стрелочные функции ведут себя не так, как обычные функции. Вспомните: при обращении к this в методе объекта, этому ключевому слову соответствует объект, которому принадлежит метод. Однако это не относится к стрелочным функциям. Вместо этого, this в таких функциях относится к глобальному контексту (к объекту window ). Рассмотрим следующий код, который можно запустить в консоли браузера.

var objReg = < hello: function() < return this; >>; var objArrow = < hello: () =>this >; objReg.hello(); // возвращает, как и ожидается, объект objReg objArrow.hello(); // возвращает объект Window!

Если, озадачившись рассматриваемым вопросом, заглянуть на MDN, там можно найти сведения о том, что стрелочные функции имеют более короткую форму записи, чем функциональные выражения и не привязаны к собственным сущностям this , arguments , super или new.target . Стрелочные функции лучше всего подходят для использования их в роли обычных функций, а не методов объектов, их нельзя использовать в роли конструкторов.

Прислушаемся к MDN и не будем использовать стрелочные функции в качестве методов объектов.

Использование this в обычных функциях

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

function test() < console.log('hello world'); console.log(this); >test(); // hello world // Window

Однако если функция выполняется в строгом режиме, то в this будет записано undefined , так как в этом режиме запрещены привязки по умолчанию. Попробуйте запустить следующий пример в консоли браузера.

function test() < 'use strict'; return this; >console.log( test() ); //функция возвращает undefined, а не объект Window

Обращение к this из функции, которая была объявлена за пределами объекта, а потом назначена в качестве его метода

Рассмотрим пример с уже известным нам объектом dog . В качестве метода этого объекта можно назначить функцию chase , объявленную за его пределами. Тут в объекте dog никаких методов не было, до тех пор, пока мы не создали метод foo , которому назначена функция chase . Если теперь вызвать метод dog.foo , то будет вызвана функция chase . При этом ключевое слово this , к которому обращаются в этой функции, указывает на объект dog . А функция chase , при попытке её вызова как самостоятельной функции, будет вести себя неправильно, так как при таком подходе this будет указывать на глобальный объект, в котором нет тех свойств, к которым мы, в этой функции, обращаемся через this .

var dog = < breed: 'Beagles', lovesToChase: 'rabbits' >; function chase() < console.log(this.breed + ' loves chasing ' + this.lovesToChase + '.'); >dog.foo = chase; dog.foo(); // в консоль попадёт Beagles loves chasing rabbits. chase(); //так эту функцию лучше не вызывать

Ключевое слово new и this

Ключевое слово this находит применение в функциях-конструкторах, используемых для создания объектов, так как оно позволяет, универсальным образом, работать со множеством объектов, создаваемых с помощью такой функции. В JavaScript есть и стандартные функции-конструкторы, с помощью которых, например, можно создавать объекты типа Number или String . Подобные функции, определяемые программистом самостоятельно, позволяют ему создавать объекты, состав свойств и методов которых задаётся им самим.

Как вы уже поняли, мне нравятся собаки, поэтому опишем функцию-конструктор для создания объектов типа Dog , содержащих некоторые свойства и методы.

function Dog(breed, name, friends) < this.breed = breed; this.name = name; this.friends = friends; this.intro = function() < console.log(`Hi, my name is $and I’m a $`); return this; >; >

Когда функцию-конструктор вызывают с использованием ключевого слова new , this в ней указывает на новый объект, который, с помощью конструктора, снабжают свойствами и методами.

Вот как можно работать со стандартными конструкторами JavaScript.

var str = new String('Hello world'); /******* Строки можно создавать так, но лучше этого не делать, используя подход, применённый при объявлении переменной str2 ниже. Одна из причин подобной рекомендации заключается в том, что в JavaScript строки удобно создавать, пользуясь строковыми литералами, когда строкой считается всё, включённое в двойные или одинарные кавычки. То же самое касается и других примитивных значений. Стоит отметить, что мне, на практике, не встречалась ситуация, когда надо было бы использовать конструкторы для создания значений примитивных типов. *******/ var str2 = 'Hello world'; // когда строка объявлена так, система, всё равно, позволяет работать с ней как с объектом

Теперь поработаем с только что созданной функцией-конструктором Dog .

// Создадим новый экземпляр объекта типа Dog var chester = new Dog('beagle', 'Chester', ['Gracie', 'Josey', 'Barkley']); chester.intro(); // выводит Hi, my name is Chester and I'm a beagle console.log(chester); // выводит Dog

Вот ещё один пример использования функций-конструкторов.

var City = function(city, state) < this.city = city || "Phoenix"; this.state = state || "AZ"; this.sentence = function() < console.log(`I live in $, $.`); >; >; var phoenix = new City(); // используем параметры по умолчанию console.log(phoenix); // выводит в консоль строковое представление объекта phoenix.sentence(); // выводит I live in Phoenix, AZ. var spokane = new City('Spokane', 'WA'); console.log(spokane); // выводит сам объект spokane.sentence(); // выводит I live in Spokane, WA.

О важности ключевого слова new

При вызове функции-конструктора с использованием ключевого слова new ключевое слово this указывает на новый объект, который, после некоторой работы над ним, будет возвращён из этой функции. Ключевое слово this в данной ситуации весьма важно. Почему? Всё дело в том, что с его помощью можно, используя единственную функцию-конструктор, создавать множество однотипных объектов.

Это позволяет нам масштабировать приложение и сокращать дублирование кода. Для того чтобы понять важность этого механизма, подумайте о том, как устроены учётные записи в социальных сетях. Каждая учётная запись может представлять собой экземпляр объекта, создаваемый с помощью функции-конструктора Friend . Каждый такой объект можно заполнять уникальными данными о пользователе. Рассмотрим следующий код.

// Функция-конструктор var Friend = function(name, password, interests, job)< this.fullName = name; this.password = password; this.interests = interests; this.job = job; >; function sayHello() < // раскомментируйте следующую строчку, чтобы узнать, на что указывает this // console.log(this); return `Hi, my name is $and I'm a $. Let's be friends!`; > // Мы можем создать один или несколько экземпляров объекта типа Friend, используя ключевое слово new var john = new Friend('John Smith', 'badpassword', ['hiking', 'biking', 'skiing'], 'teacher'); console.log(john); // Назначим функцию ключу greeting объекта john john.greeting = sayHello; // Вызовем новый метод объекта console.log( john.greeting() ); // Помните о том, что sayHello() не стоит вызывать как обычную функцию console.log( sayHello() ) ;

Итоги

На самом деле, особенности использования ключевого слова this в JavaScript не ограничиваются вышеописанными примерами. Так, в череду этих примеров можно было бы включить использование функций call , apply и bind . Так как материал этот рассчитан на начинающих и ориентирован на разъяснение основ, мы их здесь не касаемся. Однако если сейчас у вас сформировалось начальное понимание this , то и с этими методами вы вполне сможете разобраться. Главное — помните о том, что если что-то с первого раза понять не удаётся, не прекращайте учиться, практикуйтесь, читайте материалы по интересующей вас теме. В одном из них вам обязательно попадётся нечто такое (какая-то удачная фраза, например), что поможет понять то, что раньше понять не удавалось.

Уважаемые читатели! Возникали ли у вас сложности с пониманием ключевого слова this в JavaScript?

  • Блог компании RUVDS.com
  • Веб-разработка
  • JavaScript

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *