Исключение ключевого слова this ActionScript 

 

 

Как известно из гл. 1, ключевое слово this используется для обращения к  

текущему объекту внутри методов-конструкторов или методов экземпляра. Например, 

в следующем коде выражение this, pe tName = name говорит среде выполнения 

присвоить значение переменной экземпляра petName созданного объекта: 

public function Virtual Pet (name) { 

this.petName = name; 

В следующем коде выражение this. currentCalories += numberOf Calories 

говорит среде выполнения присвоить значение переменной currentCalories 

того объекта, метод eat ( ) которого был вызван: 

public function eat (numberOfCalories) { 

this.currentCalories += numberOfCalories; 

Использование ключевого слова this в коде, в котором происходит частое  

обращение к переменным и методам текущего объекта, может оказаться  

утомительным, а также приведет к загруженности кода. Для упрощения и улучшения 

читабельности кода язык ActionScript позволяет обращаться к переменным и  

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

this. 

Вот как это работает: когда среда выполнения Flash встречает идентификатор в  

выражении внутри метода-конструктора или метода экземпляра, она выполняет поиск 

локальной переменной, параметра или вложенной функции, чье имя совпадает 

с именем данного идентификатора (вложенные функции рассматриваются в гл. 5). 

Если ни одно из имен локальных переменных, параметров или вложенных функций 

не совпадает с именем идентификатора, среда Flash автоматически выполняет поиск 

переменной или метода экземпляра, чье имя совпадает с именем идентификатора. 

Если совпадение найдено, то в выражении будут использованы соответствующие 

переменная или метод экземпляра. 

Например, рассмотрим, что произойдет, если мы уберем ключевое слово this из 

метода eat ( ), как показано в следующем коде: 

public function eat (numberOfCalories) { 

currentCalories += numberOfCalories: 

При выполнении приведенного выше кода среда Flash встречает идентификатор 
numberOf Calories и пытается найти локальную переменную, параметр или  
вложенную функцию по данному имени. У метода есть параметр с таким именем, 
поэтому в выражении используется значение этого параметра (вместо  
идентификатора numberOf Calories). 
После этого среда выполнения Flash встречает идентификатор currentCalor ies 
и пытается найти локальную переменную, параметр или вложенную функцию по 
данному имени. С именем cur rentCalor ies нет ни одной переменной, параметра 
или вложенной функции, поэтому среда Flash пытается найти переменную или  
метод экземпляра по данному имени. На этот раз поиск оказывается успешным: класс 
VirtualPet содержит переменную экземпляра с именем currentCalories, 
поэтому среда выполнения Flash использует эту переменную в выражении. В  
результате значение параметра numberOf Calories прибавляется к значению  
переменной экземпляра currentCalories. 
Следовательно, внутри метода eat ( ) выражения this . currentCalories 
и currentCalories являются идентичными. 
Для улучшения читабельности кода многие разработчики (это относится и к данной 
книге) избегают частого использования ключевого слова this. С этого момента 
при обращении к переменным и методам экземпляра мы будем опускать ключевое 
слово this. Тем не менее некоторые программисты предпочитают использовать 
его всегда лишь для того, чтобы отличать переменные и методы экземпляра от 
локальных переменных. 
Обратите внимание, что использование ключевого слова this допустимо только 
внутри методов экземпляра, методов-конструкторов, функций и кода в глобальной 
области видимости (рассматривается в гл. 16). Применение ключевого слова this 
в любом другом месте программы приведет к ошибке на этапе компиляции. 
Разрешение конфликтов имен переменных/параметров. Когда переменная  
экземпляра и параметр метода имеют одинаковые имена, для обращения к переменной 
можно использовать ключевое слово this (это называется разрешением  
неоднозначности между переменной и параметром). Например, в следующей  
модифицированной версии класса VirtualPet представлен метод eat ( ) с параметром 
calories, имя которого совпадает (то есть конфликтует) с именем переменной 
экземпляра calories: 
package zoo { 
internal class VirtualPet { 
// Переменная экземпляра \'calories\' 
private var calories = 1000: 
// Метод с параметром \'calories\' 
public function eat (calories) { 
103 
this.calories += calories; 
Внутри тела метода eat ( ) выражение calories (без ключевого слова this) 
ссылается на параметр метода, а выражение this . calories (с ключевым  
словом this) — на переменную экземпляра. В этом случае говорят, что параметр 
calories затеняет переменную экземпляра calories, поскольку сам по себе 
идентификатор calories ссылается на параметр, а не на переменную экземпляра. 
Обратиться к переменной экземпляра можно только с помощью ключевого слова 
this. 
Обратите внимание, что, как и параметры, локальные переменные могут затенять 
переменные и методы экземпляра, чьи имена совпадают с именами локальных 
переменных. Локальная переменная также затеняет параметр метода с таким же 
именем, фактически переопределяя данный параметр и не оставляя программе 
никакого шанса обратиться к нему. 
Многие программисты специально используют одинаковые имена для параметров 
и переменных экземпляра, полагаясь на ключевое слово this при разрешении 
неоднозначностей. Тем не менее, чтобы ваш код легко читался, вы можете просто 
избегать использования имен параметров, совпадающих с именами переменных, 
методов экземпляра или локальных переменных. 
Теперь перейдем к рассмотрению следующего вопроса, касающегося методов  
экземпляра, — связанных методов. 




BACK NEXT

Сайт является частным собранием материалов и представляет собой любительский информационно-образовательный ресурс. Вся информация получена из открытых источников. Администрация не претендует на авторство использованных материалов. Все права принадлежат их правообладателям