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;
        }
    }
}

プロキシ呼び出しは各呼び出しに非常に短い時間を追加するため、単なる楽しみです。非常に頻繁に使用する場合 (例: 1 フレームあたり 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);

多くの引数を取る 1 つのメソッドを作成し、デフォルトの引数を変更しないままにすることもできます。

于 2013-10-11T08:37:26.227 に答える
0

相対プロパティを新しいデータ構造体としてまとめることができます。

たとえば、flash.text.TextFormatです。テキストで使用できるプロパティが含まれています。

いくつかの個別のプロパティの代わりにデータ構造体オブジェクトを渡すことができます。これにより、コードがよりシンプルで明確になります。たとえば、同じテキスト スタイルを別のテキストからコピーしたい場合は、ターゲット テキストの textFormat を取得し、それをテキストに設定するだけです。

于 2013-10-11T08:50:10.380 に答える