我正在迭代component.nonInheritingStyles(UIComponent),我发现了重复的属性。怎么可能?
var array:Array = getArrayFromObject(myLabelComponent.nonInheritingStyles);
/**
*
**/
protected function getArrayFromObject(value:Object):Array {
var array:Array = [];
for (var styleProp:String in value) {
trace("style:"+styleProp); // fontFamily duplicates a few times
array.push({name:styleProp, value:value[styleProp]});
}
return array;
}
答案 0 :(得分:2)
Flex SDK中的CSSStyleDeclaration类中的所有魔法。
你可以找到方法:
mx_internal function addDefaultStyleToProtoChain(chain:Object,
target:DisplayObject,
filterMap:Object = null):Object
你可以看到代码:
defaultFactory.prototype = chain;
chain = new defaultFactory();
这是包含所有魔法的代码。
为了理解它你可以写例子:
protected function getArrayFromObject(value:Object):Array {
var array:Array = [];
var parentStyleFactory:Function = function():void {
this.x = 1;
}
var styleFactory:Function = function():void {
this.x = 2;
}
var parentStyle:Object = new parentStyleFactory();
styleFactory.prototype = parentStyle;
var style:Object = new styleFactory();
for (var styleProp:String in style) {
trace("style:"+styleProp); // fontFamily duplicates a few times
array.push({name:styleProp, value:style[styleProp]});
}
return array;
}
这是示例将跟踪:
[trace] style:x
[trace] style:x
答案 1 :(得分:1)
如果你写这个例子:
var obj:Object = {x:1, y:1};
var factory:Function = function(){
this.x = 2;
};
factory.prototype = obj;
var obj2:Object = new factory();
trace(obj2.x);
trace(obj2.y);
您将在控制台中看到:
[trace] 2
[trace] 1
因此,如果你尝试获取某些属性的值,则尝试访问对象属性,如果属性不存在,则尝试从原型访问属性。
但是当您通过对象属性迭代forin时,flash会返回所有对象属性和所有对象原型属性。
答案 2 :(得分:0)
我的猜测是,它一次从一个类的继承链中抓取样式而不是寻找重复样式。它似乎不是该功能的目的。
此组件的非继承样式链的开头。该 getStyle()方法只是访问nonInheritingStyles [styleName] 搜索整个原型链接链。此对象由以下设置 initProtoChain()。开发人员通常永远不需要访问它 财产直接。
也许你想继承游戏