Диагностика, ремонт и защита


Массив аргументов


  Недокументированная особенность!

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

Есть одна вещь, которая обособляет конструкторы вместе с методами - им можно слать сообщения. Методы могут даже возвращать сообщения (конструкторы, правда возвращают экземпляры объектов). Об этом мы говорили в разделе про аргументы - аргументы функции это сообщения и возвращаемая величина тоже есть сообщение. Теперь мы поближе рассмотрим механизм передачи этих сообщений.

На самом деле аргументы метода в ActionScript находятся в двух местах. Во-первых, создается новое локальное свойство (локальное по отношению к запущенному активируемому объекту) для каждого имени, которые перечислены в определении метода между скобками (arg1, arg2). Второе же место где это добро лежит - массив с именем arguments (будем его обозначать, как arguments[], чтобы было понятно, что это массив). В этом массиве аргументы хранятся в том же порядке, в котором они переданы в метод. То есть в вышеуказанном примере массив будет состоять из 2-х значений, сначала arg1 (в arguments[0]), а потом arg2 (в arguments[1]). Вот пример: test = function( arg0, arg1 ) { trace( arg0 +" "+ arg1 ); // вывод - "1ый 2ой" this.( arguments[0] +" "+ arguments[1]); // вывод - "1ый 2ой" } test( "1ый", "2ой" );

Отличительные черты характера этой недокументированной особенности следующие. Во-первых, наиболее интересным представляется возможность передачи заранее неизвестного количества аргументов. Например, хочется написать метод расчета среднего значения для непостоянного количества чисел. Это можно сделать например так: getAverage = function( _args_ ) { var total = 0; for(var i = 0; i < arguments.length; i++) { total += arguments[i]; } return total / arguments.length; } this.( getAverage(4,5,3,2,6,10) ); // вывод - "5" this.( getAverage(54,45,96) ); // вывод - "65"

Это главный аргумент "за" использование такой интересной особенности. Примите во внимание, что слово _args_ не обязательно, но я таким образом самому себе напоминаю, что в этот метод должно что-то передаваться. При выходе из метода эта переменная уничтожится, следовательно, никакого вреда она не несет, а склероз - вещь распространенная...

Есть правда и сюрпризы. Оказывается, массив аргументов - это НЕ МАССИВ! Можно узнать его длину, но нельзя использовать такие методы, как pop() или push(). Другой сюрприз, а возможно, что просто жучок - arguments[0] и первая переменная в списке переменных это не один и тот же объект. Поэтому, если в методе с аргументами (arg0, arg1) мы поменяем значение arg0, то arguments[0] все равно будет иметь старое значение. Имейте это в виду при написании программ... (может, это не баг, а фича! Интересно, а почему ничего не сказано про остальные аргументы? - прим.пер.)

Ну и последнее, что надо бы знать про этот "массив", это то, что у него есть одно интересное свойство с именем callee. Понятное дело, что набрать слово callee проще, чем prototype или __proto__, но про него читайте в следующем разделе...

<<    ООП во Flash 5    >>

 









Начало  Назад  Вперед


Книжный магазин