为什么我的 for 循环不适用于对象?
Why is my for loop not working on object?
我的 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];
}
}
}
和class:
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;
}
更多相关问题:
您是否总是必须将 属性 设置为可枚举才能工作?使我的 class 显式扩展 Object 会导致任何更改吗?将其标记为动态怎么样?
The documentation of the for..in statement 声明如下:
Iterates over the dynamic properties of an object or elements in an array and executes statement for each property or element. Object properties are not kept in any particular order, so properties may appear in a seemingly random order. Fixed properties, such as variables and methods defined in a class, are not enumerated by the for..in statement. To get a list of fixed properties, use the describeType() function, which is in the flash.utils package.
真正的问题是为什么您在 this
和 previousPresets
上都有属性。
与其仅在调用该方法 savePresets()
时才创建 previousPresets
对象,不如从一开始就创建它,并始终将值保存到该对象而不是 this
中。为什么要用所有这些值膨胀 this
?
使用 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 = item.@name;
properties.push(propertyName);
}
if (sort) properties.sort();
return properties;
}
我的 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];
}
}
}
和class:
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;
}
更多相关问题:
您是否总是必须将 属性 设置为可枚举才能工作?使我的 class 显式扩展 Object 会导致任何更改吗?将其标记为动态怎么样?
The documentation of the for..in statement 声明如下:
Iterates over the dynamic properties of an object or elements in an array and executes statement for each property or element. Object properties are not kept in any particular order, so properties may appear in a seemingly random order. Fixed properties, such as variables and methods defined in a class, are not enumerated by the for..in statement. To get a list of fixed properties, use the describeType() function, which is in the flash.utils package.
真正的问题是为什么您在 this
和 previousPresets
上都有属性。
与其仅在调用该方法 savePresets()
时才创建 previousPresets
对象,不如从一开始就创建它,并始终将值保存到该对象而不是 this
中。为什么要用所有这些值膨胀 this
?
使用 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 = item.@name;
properties.push(propertyName);
}
if (sort) properties.sort();
return properties;
}