3

这是一个非常基本的问题,我敢肯定在某个地方有答案,但对于我的生活,我找不到它。无论如何,我有很多要更改的对象的新实例的变量,并且主要是为了好玩,我想我会尝试缩短语法或将它们链接在一起。但我不能。这是一些示例代码:

var text = new TextObjectThing(0, 0, 500, "Text");
text.color = 0xFFFFFFFF;
text.size = 26;
text.scrollFactor.x = 0;
text.scrollFactor.y = 0;

如您所见,您必须多次执行“text.property”。这在实际意义上很好,但我只是想知道是否有人知道如何重新组织一下。

编辑:我想如果您出于某种原因想要/需要拥有一个匿名对象,这将很重要。如果它是匿名的,你就不能像那样设置这些变量。

4

3 回答 3

3

您可以使用技巧来链接调用而不修改您的 Object :

var shape : Shape = new Shape;
// Chain property init
Initializer.init(shape).x(100).y(100).alpha(.5);

// Chain function call
Initializer.init(shape.graphics).beginFill( 0xFF0000 ).drawCircle( 100, 100, 50).endFill().beginFill( 0xFFFFFF ).drawCircle( 100, 100, 10).endFill();

addChild(shape);

和初始化类:

package
{
    import flash.utils.Proxy;
    import flash.utils.flash_proxy;

    public dynamic class Initializer extends Proxy
    {
        // To avoid new instance
        private static var _instance : Initializer = new Initializer(null);;

        // Current target Object
        private var _target : Object;

        // Constructor
        public function Initializer(target : Object){
            _target = target;
        }

        // Call it to avoid new Initizer instance
        public static function init(target : Object) : Initializer{
            _instance._target = target;
            return _instance;
        }

        // Catch function call and return initializer to chain call
        override flash_proxy function callProperty(name:*, ... rest):* {
            if(_target)
            {
                // Emulate function setter
                if(_target.hasOwnProperty(name) && !(_target[name] is Function))
                    _target[name] = rest[0];

                // If not a property, call as a classic function
                else
                    _target[name].apply(_target, rest);
            }
            return this;
        }
    }
}

这只是为了好玩,因为代理调用为每次调用添加了非常小的时间,如果您想非常频繁地使用它(例如:每帧 10000),使用经典方法会更快。

您还可以使用“with”关键字(请注意构造函数后的 ; 字符):

var tf : TextField = new TextField(); with(tf) {
    text = "Hello";
    alpha = .5;
    setTextFormat( new TextFormat( "Verdana", 16, 0xFF0000) );
}

或者当值相同时链接:

var text = new TextObjectThing(0, 0, 500, "Text");
text.scrollFactor.x = text.scrollFactor.y = 0;
于 2013-10-11T08:42:55.847 回答
1

如果你让方法返回这个,你可以链接它。

public method setColor(hex:uint):this
public method setSize(size:Number):this

然后你可以制作

text.setColor(0xFFFFFF).setSize(26);

您还可以创建一种方法,该方法将采用许多参数,并保持默认参数不变

于 2013-10-11T08:37:26.227 回答
0

您可以将相关属性组织在一起作为新的数据结构。

例如flash.text.TextFormat。它包含可以在文本中使用的属性。

您可以传递数据结构对象而不是几个单独的属性。这将使您的代码更加简单和清晰。例如,您想从另一个文本中复制相同的文本样式,您只需要获取目标文本的 textFormat 并将其设置为您的文本。

于 2013-10-11T08:50:10.380 回答