Добавьте функции в playerglobal.swc или разрешите компилятору передавать собственные функции

#flash #actionscript-3 #apache-flex #sdk

#flash #actionscript-3 #apache-flex #sdk

Вопрос:

Я добавляю множество простых функций к прототипам объектов верхнего уровня (объект, массив, строка …) и у меня есть 2 вопроса :

Возможно ли добавлять функции в классы верхнего уровня во время компиляции?

Если нет, есть ли способ разрешить компиляцию этих функций? Мне не нравится отключать строгий режим, я пытаюсь, и это не очень хорошая идея.

пример:

 string.removeWhiteSpace();
string.sliceStr("." , "end");
textField.scrollBottom();
 

это возвращает ошибку времени компиляции, потому что такой функции нет, я должен записать ее в фигурных скобках :

 string["removeWhiteSpace"]();
string["sliceStr"]("." , "end");
textField["scrollBottom"]();
 

и мне нравится это делать)

Комментарии:

1. отредактируйте свой код, чтобы он отображался правильно

Ответ №1:

Вы нашли правильный способ решения этой проблемы. Возиться с прототипами в AS3 — это взлом, поэтому вам нужны хакерские методы, чтобы заставить его работать.

Другим способом было бы привести ваши строки и массивы к Object перед вызовом методов.

Еще лучшим способом было бы не связываться с прототипами объектов верхнего уровня и реализовать служебные классы, как это делает Adobe — StringUtil, ArrayUtil и т. Д.

Комментарии:

1. Я долгое время работаю с прототипами и никогда не испытываю никаких проблем, только это то, о чем я пишу, прямо сейчас я вызываю функцию попрошайничества, которая добавляет к прототипам все функции, а затем я запускаю код rest.

2. Такой функции нет, просто невозможно работать чистым способом с прототипами в AS3. Тем не менее, мне интересно, почему вы абсолютно хотите работать с прототипами? Это усложняет вашу жизнь, ваш код загроможден взломами и, вероятно, медленнее, и вы не получаете выгоды от проверки времени компиляции. Использование служебного класса было бы более эффективным и намного более чистым.

3. Я понятия не имею, почему вы думаете, что функции в прототипах могут быть медленнее и с взломами. И о проверке во время компиляции — это то, о чем я прошу, возможно ли добавить эти функции в playerglobal.swc или любым другим способом…

Ответ №2:

Класс String использует атрибут «final», что означает, что он не может быть переопределен.
Итак, чтобы ответить на ваш вопрос «нет», вы в любом случае не можете переопределить его.
Обычно это делается в классе верхнего уровня из-за проблем с производительностью.
Класс объекта использует атрибут типа «динамический» Все классы, которые не объявляют явный базовый класс, расширяют встроенный класс объекта.

Класс Array также использует «динамический»

Что касается вашего примера.

 string.removeWhiteSpace()
 

вы могли бы сделать

 string.split(" ").join('')
 

и это позволит достичь того, что вы ищете.

Комментарии:

1. нет, вы совершенно не понимаете, что я имею в виду:] с пробелом это просто пример. Я знаю, что не могу переопределить string , поэтому я добавляю функции в прототипы и прошу другой способ сделать это.