Я чувствую себя намного лучше по поводу 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
. Спасибо за чтение и удачного кодирования.
-Лу