2015-08-14 6 views
0

My for loop не передает никаких свойств моего объекта. Здесь что-то не хватает?Почему мой цикл for не работает над объектом?

public var previousPresets:HTMLExportOptions; 

public function savePresets():void { 
     if (previousPresets==null) { 
      previousPresets = new HTMLExportOptions(); 
     } 

     // set properties 
     for (var property:String in previousPresets) { 
      if (property in this) { 
       previousPresets[property] = this[property]; 
      } 
     } 
    } 

И класс:

public class HTMLExportOptions extends ExportOptions { 

    public function HTMLExportOptions() { 

    } 

    public var addZoom:Boolean; 
    public var showScreenshotBackground:Boolean; 
    public var showFullHTMLPageSource:Boolean; 
    public var useInlineStyles:Boolean; 
    public var showBorders:Boolean; 
    public var showBordersCSS:String; 
} 

Вопросы, относящиеся Больше:

Вы всегда должны установить свойство перечислимого для его работы? Будет ли мой класс явно расширять Object за любые изменения? Как насчет того, чтобы она была динамичной?

+0

'для в' Я верю в AS3 работает только с динамическими свойствами – BadFeelingAboutThis

+0

@BadFeelingAboutThis Я помню, что читал что-то об этом давно, но я использовал для перед и не помню, встречая этот вопрос. У меня тоже не работает цикл for. Я обновил вопрос. –

+0

явно расширяющий объект ничего не изменит – BadFeelingAboutThis

ответ

0

Использование describeType рода работ, но он по-прежнему нуждается в некоторой работе и организации. Этот метод получает XML-список свойств и где они были объявлены.

var properties:Array = getPropertiesArray(options); 


public static function getPropertiesArray(object:Object, sort:Boolean = true):Array { 
    var describedTypeRecord:DescribeTypeCacheRecord = mx.utils.DescribeTypeCache.describeType(object); 
    var typeDescription:* = describedTypeRecord.typeDescription; 
    var hasFactory:Boolean = typeDescription.factory.length()>0; 
    var factory:XMLList = typeDescription.factory; 
    var itemsLength:int; 
    var itemsList:XMLList; 
    var propertyName:String; 
    var properties:Array = []; 

    itemsList = hasFactory ? factory.variable + factory.accessor : typeDescription.variable + typeDescription.accessor; 
    itemsLength = itemsList.length(); 

    for (var i:int;i<itemsLength;i++) { 
     var item:XML = XML(itemsList[i]); 
     propertyName = [email protected]; 
     properties.push(propertyName); 
    } 

    if (sort) properties.sort(); 

    return properties; 
} 
1

The documentation of the for..in statement утверждает следующие:

перебирает динамических свойств объекта или элементов в массиве, и выполняет заявление для каждого свойства или элемента. Свойства объекта не сохраняются в каком-либо конкретном порядке, поэтому свойства могут отображаться в кажущемся случайном порядке. Фиксированные свойства, такие как переменные и методы, определенные в классе, не перечисляются оператором for..in. Чтобы получить список фиксированных свойств, используйте функцию describeType(), которая находится в пакете flash.utils.

Реальный вопрос, почему у вас есть свойства на обоих this и previousPresets.

Вместо того, чтобы создавать объект previousPresets только при вызове этого метода savePresets(), используйте его с самого начала и всегда сохраняйте значения в этом объекте, а не this. Зачем раздувать this со всеми этими значениями?

+0

Хм. Хорошая точка зрения.Когда я написал это, я думал о классе XML. У этого есть способ сохранения настроек, а также позволяет устанавливать статические вары. –

+0

@ 1.21gigawatts вы можете добавить статические переменные в каждый класс. – null

Смежные вопросы