Этот классный this.
Запись от Psycho Tiger размещена 13.12.2010 в 00:38
Каждый флешер просто обязан знать что такое this. this — ссылка на "себя", на текущую область видимости можно сказать.
Чаще всего this будет ссылкой на экземпляр класса, в котором выполняется этот код. Его использование перед другими операторами, например такими как точка (.) позволяют уточнить область видимости, где нужно найти переменную. Это бывает очень полезно если вдруг случилось так, что локальная переменная и поле класса имеют одинаковые идентификаторы. Мне, кстати, всегда было немного забавно как новички налево и направо лепят this, а когда встречают строчку с super очень пугаются. Но мы совсем не о том.
Давайте подумаем, что мы можем получить в качестве this.
Очевидно, что текущий экземпляр, в случае если this написано в методе или конструкторе. Создав функцию мы можем поменять ей this с помощью методов apply и call класса Function. Если функция вызывается сразу же, с помощью оператора скобок ( ) — тогда контекст this будет такой же, как и в методах, другими словами ссылкой на текущий экземпляр.
this, как и super кстати говоря нельзя использовать вместе с модификатором static. Оно и понятно — какое может быть this если у нас нет экземпляров. Хотя, чисто по логике this в таком случае может ссылаться на Class в котором он написан, но этого не происходит. И слава богу, программист сам в состоянии знать в каком классе он пишет код и скорее всего написав this он допустил ошибку.
Теперь давайте побудем крутыми. Получим ссылку на Class через this, утрём нос этим конформистам.
package { import flash.display.Sprite; public class SomeBaseClass extends Sprite { public function SomeBaseClass() { super(); var func:Function = function():void { trace(this); }; func.apply(SomeBaseClass); //[class SomeBaseClass] } } }
Но многие ли из вас способны заставить this ссылаться на Class... не используя ни apply, ни call, ни создавая функций? Я вот тоже не могу.
Но на этой почве можно поссорить интерпретатор с компилятором )
Например, напишите вот такой код:
package { import flash.display.Sprite; public class SomeBaseClass extends Sprite { private var someThing:NewClass = new NewClass(this); public function SomeBaseClass() { super(); } } }
package { public class NewClass { public function NewClass(someArg:SomeBaseClass):void { trace(someArg); } } }
Код:
***\src\SomeBaseClass.as(7): col: 49 Error: Implicit coercion of a value of type Class to an unrelated type SomeBaseClass.
Теперь на этом моменте можно остановится и помечтать. Что же это значить может? Почему инициализируя поле в том блоке кода компилятор считает что там Class? Кто знает, может это и есть поддержка this в static, которую потом выпилили, а это осталось. Кто знает, может это знак что мне стоит прекратить работать до 4 утра по воскресеньям. Кто знает...
Всего комментариев 11
Комментарии
![]() ![]() |
|
Не до, а пофиг где, можно и после. Но только для объявленных локальных переменных.
|
![]() ![]() |
|
Ох ты, вот оно в чем дело. Спасибо, а я иногда понять не мог, что не так)
|
![]() ![]() |
|
А все потому что сами переменные объявляются до super(). А значение после. В итоге компилятор косячит, непонятно как считая объявление переменной в коде.
|
![]() ![]() |
|
Цитата:
А все потому что сами переменные объявляются до super(). А значение после. В итоге компилятор косячит, непонятно как считая объявление переменной в коде.
|
![]() ![]() |
|
![]() ![]() |
|
Точно! Вчера уже без меня обсудили
![]() Итог: Цитата:
|
Последние записи от Psycho Tiger
- Тонкости и трюки ActionScript`а, которые... бесполезны (10.05.2011)
- Vkontakte: как пользоваться wall.post, нужен ли теперь wall.savePost? (05.03.2011)
- А пятый контер-страйк хорош. (19.01.2011)
- Пацаны, гоу Вконтакте? (21.12.2010)
- Давайте начистоту (18.12.2010)