Итерация – это процесс циклического повторения различных свойств,
определенных внутри системы или объекта. В основе ActionScript 2 все
явные определения внутри объекта могли быть помещены в цикл с помощью
конструкции for..in. Единственный способ предотвратить зацикливание для
любого, или всех этих свойств, заключался в использовании
недокументированного метода, называемого ASSetPropFlags(). В
ActionScript 3 цикл с конструкцией for..in применяется только к
динамическим определениям в динамических объектах. Это означает, что
внутри любого объекта методы или свойства, определенные классом, не
будут видны в процессе итерации, при этом нет способа сделать их
видимыми. Можно сделать динамические определения невидимыми для цикла,
используя в ActionScript 3 функцию setPropertyIsEnumerable().
Класс Array – это динамический класс, имеющий нединамические
определения. Используя for..in, можно получить доступ только к
динамическим определениям внутри этого класса, даже если внутри этого
класса по-прежнему существуют другие определения.// Create a list array var list:Array = new Array(); list[0] = "bread"; list[1] = "milk"; list.type = "grocery"; // Iterate through properties in list var prop:String; for (prop in list) { trace(prop + ": " + list[prop]); } /* output 0: bread 1: milk type: grocery */ // length is an Array property but not // enumerable since part of class definition trace(list.length); // traces 2 // Hide type property from enumeration list.setPropertyIsEnumerable("type", false); // length can not be made enumerable // through setPropertyIsEnumerable list.setPropertyIsEnumerable("length", true); for (prop in list) { trace(prop + ": " + list[prop]); } /* output 0: bread 1: milk */
Обратите внимание, что при перечислении длина не
может быть найдена, даже если была сделана попытка установить видимость
посредством setPropertyIsEnumerable. Это потому, что она является
частью определения класса. На самом деле, любая переменная, объявленная
с помощью var, рассматривается как часть определения класса. Это
означает, что даже переменные, определенные внутри временной шкалы, не
будут перечислены для этой временной шкалы. // var-declared variables do not enumerate var a:Number = 1; var b:Number = 2; for (var prop:String in this){ trace(prop + ": " + this[prop]); } // traces no output Чтобы
сделать переменные временной шкалы перечисляемыми, нужно определить их
в качестве динамических свойств. Чтобы проделать это, вам придется
определить переменную с использованием this. Тем не менее, динамические
переменные, определенные в такой форме, не могут быть типизированы. // dynamic variables enumerate this.a = 1; this.b = 2; for (var prop:String in this){ trace(prop + ": " + this[prop]); } /* output b: 2 a: 1 */
|