Я чувствую себя намного лучше по поводу this теперь, когда он начинает доходить до меня. За последние пару дней я чувствовал, как мой мозг тянется и перенапрягается, пытаясь уловить концепцию. Это казалось таким призрачным и неосязаемым с каждым новым примером, с которым я сталкивался. Я видел несколько похожих примеров и думал: «Хорошо, я понял», а затем пытался применить свое понимание в немного другом контексте, и внезапно я возвращался к исходной точке; возвращает undefined, если ожидается обратное. Теперь я знаю ровно столько, чтобы понять, что не могу этого объяснить, поэтому этот пост посвящен self. Я не овладею им, пока не буду использовать его намного больше. Я продолжаю слышать, что как только я начну изучать React, this будет гораздо более часто встречающейся концепцией.

На общем уровне this для Javascript то же, что self для Ruby. Оба слова очень мало значат вне контекста — как в английском языке. Слово «это» на самом деле ничего не значит, пока у него нет контекста, из которого можно сделать вывод о значении. Тем не менее, я не чувствую себя достаточно свободно, чтобы предсказывать его поведение или даже знать, когда лучше его использовать или найти другой обходной путь. Однако я чувствую, смею сказать, очень комфортно работать с Ruby's self. Я вижу, как self принимает непосредственный контекст, в котором он находится. Например (без каламбура), предваряя имя переменной self. - если эта переменная находится внутри метода класса, self будет представлять экземпляр, который в конечном итоге будет иметь доступ к значению этой переменной. В этом контексте self – это, например, ссылка, указывающая на экземпляр garfield класса Cat или на экземпляр brian_griffin класса Dog. Класс в целом служит образцом для создания своих копий, которые поставляются с предварительно загруженными атрибутами и поведением, к которым экземпляр self будет иметь доступ.

Блин… это было запутанным глотком. Давайте посмотрим на пример, который, вероятно, будет иметь больше смысла:

В приведенном выше примере показаны различные способы использования self. Начиная со строки 8, этот код будет помещать каждый новый экземпляр Cat в массив с именем @@all. В этом случае мы видим self как отдельный фрагмент кода, который находится в области действия экземпляра (поскольку он находится внутри метода экземпляра). Другими словами, this self представляет отдельный объект cat с доступом к атрибутам экземпляра, таким как name и catchphrase, и методам экземпляра, таким как greet. В полном объеме эта строка кода запускается после создания экземпляра нового кота.

Для следующего использования self в строке 12 отображаемый синтаксис действителен, но код будет работать точно так же, если мы удалим ключевые слова self. Ruby достаточно интуитивно понятен, чтобы найти атрибуты name и catchphrase, даже не сообщая, что они принадлежат экземпляру. Тем не менее, self.name внутри метода экземпляра указывает на другую строку для каждого экземпляра класса. Как видно из строк 22 и 23, атрибут name каждого экземпляра указывает на собственную строку. В строке 12 self является своего рода заполнителем для любого экземпляра, которому будут принадлежать эти атрибуты. Это подтверждает идею о том, что из этого контекста self указывает на экземпляр, а не на весь класс.

Последний пример того, как Ruby использует self, можно увидеть в строке 15 приведенного выше примера. Когда self. помещается перед именем метода в сигнатуре метода, self сообщает Ruby, что следующий метод применяется ко всему классу, а не только к одному его экземпляру. Этот тип метода удачно называется методом класса. Это метод, который нельзя вызывать для экземпляра. Как показано в сообщении об ошибке в строке 26, когда мы пытаемся вызвать экземпляр метода класса.

Область видимости определяет, что такое self. Конечно, в этом отношении между self и this есть сходство, но гибкость Javascript как функционального и объектно-ориентированного языка делает this немного более скользким, чем self. Однако в следующем посте я постараюсь объяснить this. Спасибо за чтение и удачного кодирования.

-Лу