AS2: нет собственности с именем - PullRequest
2 голосов
/ 01 февраля 2012

Я использую addProperty() для динамического заполнения класса геттерами.Вот фрагмент моего кода, который делает именно это:

for (var i in options)
{
    this.addProperty(i, getOption, null);
    this._optionCount++;
}

//a little while later....

public function getOption() 
{
    return "hellO";
}

Это работает успешно, потому что, когда я вызываю следующее из временной шкалы (предыдущий код является частью класса DropDown):

var options:Object = new Object();
options.one = "hello";
options.two = "goodday";
options.three = "yo";
options.four= "MEGA AMAZING";
options.five= "yo yo yo";
var drop1:DropDown = new DropDown(this.drop1, "red", options)

И попытка отследить все свойства в var drop1 с помощью:

for (var i in drop1) 
    trace(i+" = "+drop1[i]);

Я получаю следующее:

_initY = -107
_mask = _level0.drop1.mask
_dropdown = _level0.drop1.options
_optionWidth = 143
_button = _level0.drop1
one = hellO
two = hellO
three = hellO
four = hellO
_optionCount = 5
five = hellO
_shadow = 8330268
_highlight = 9249057

Тем не менее, когда я пытаюсь отследитьследующее:

trace(drop1.one);

Это дает мне ошибку компилятора, говорящую:

Нет свойства с именем 'one'.

Кто-нибудь знает, почему я не могу получить доступ к этой собственности?

Ответы [ 2 ]

0 голосов
/ 01 февраля 2012

Просто предположение - я уже давно не использую AS2.

В тот момент, когда вы объявляете тип в AS2, компилятор думает, что знает все об этом типе.Он смотрит на объявление класса и воспринимает это как Евангелие.Это означает, что он не позволит вам присваивать свойства, которых нет в объявлении класса.

Насколько я помню, вы не единственные, кто попадает в эту ловушку AS2.Было несколько классов, у которых отсутствовали методы или свойства в объявлениях встроенных классов, которые поставлялись с каждой версией Flash.Это означает, что вы не можете получить к ним доступ безопасным типом.

Нет действительно хорошего решения, но есть обходные пути, хотя все они связаны с удалением безопасности типов, которую вы пытались применить.В порядке (моего) предпочтения, от худшего к лучшему:

  • Не объявляйте тип: var drop1 = new DropDown(this.drop1, "red", options); должно работать.
  • Объявите свой класс как динамический: dynamic public class DropDown() ...(что, конечно, также избавляет от безопасности типов)
  • Использовать доступ к массиву: trace(drop1["one"]); (предпочтительнее предыдущих, потому что он сохраняет преимущества безопасности типов для остальной части класса).
  • Не связывайтесь с addProperty.Вместо этого используйте установщик / получатель стилей функций (getOption() / setOption()).

Причина выбора последнего: он может не выглядеть "хорошо" (если addProperty действительно работал хорошо),но это работает, и легко понять, что происходит в коде.В отличие от addProperty, который добавляет уровень косвенности, который с большей вероятностью сделает ваши добавленные свойства волшебными для тех, кто читает ваш код.

0 голосов
/ 01 февраля 2012

Вы хотите изучить AsSetPropertyFlags и узнать, как установить перечисляемые свойства.Однако я бы не стал делать это так, как вы, вместо этого у меня были бы функции setOption (option) и getOption (option) - меньше кода, меньше косвенных ссылок, меньше мрака.В худшем случае я бы реализовал __resolve () в своем классе.

В качестве отступления, если вы пишете AS2 в классах, то, вероятно, имеет смысл взглянуть на лучший компилятор (MTASC или FLASC),то, что вы, кажется, используете.

...