1

我正在迭代 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;
        }
4

3 回答 3

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
于 2012-09-11T21:18:48.033 回答
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

因此,如果您尝试获取某些属性的值 flash 尝试访问对象属性,如果属性不存在,它会尝试从原型访问属性。

但是,当您通过对象属性在 forin 中迭代时,flash 将返回所有对象属性和所有对象原型属性。

于 2012-09-12T08:23:15.553 回答
0

我的猜测是,它一次从一个类的继承链中获取样式,而不是寻找重复的样式。这似乎不是该功能的目的。

此组件的非继承样式链的开始。getStyle() 方法只是访问 nonInheritingStyles[styleName] 来搜索整个原型链接链。该对象由 initProtoChain() 设置。开发人员通常不需要直接访问此属性。

来源

也许你想要继承Styles

于 2012-09-12T13:25:50.267 回答