对象中的重复属性

时间:2012-09-11 20:05:36

标签: actionscript-3 flex

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

3 个答案:

答案 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()。开发人员通常永远不需要访问它   财产直接。

SOURCE

也许你想继承游戏