-1

ActionScriptのプロパティのデフォルト値としてオブジェクトリテラルを使用している場合、これにより、すべてのインスタンスによって参照される単一のオブジェクトが作成されますか、それともインスタンスごとに新しいオブジェクトが作成されますか?

たとえば、これの複数のインスタンスを作成した場合AddressBook...

class AddressBook {
    private var numbersByName:Object = {};

    public function addNumber(name:String, number:String):void {
        numbersByName[name] = number;
    }

    public function getNumber(name:String):String {
        return numbersByName[name];
}

...それらは適切に動作しますか、それとも同じnumbersByNameオブジェクトを使用して、1つの変更が他のオブジェクトにも適用されるようにしますか?


AddressBookインスタンスが独自のオブジェクトを取得する場合でも、Flashはこの動作を浅くしか適用しない可能性があると考えられます。ネストされたオブジェクトリテラルのデフォルトを考えてみましょう。

class AddressBook {
    private var indicies:Object = {
        numberToName: {},
        nameToNumber: {}
    };

    public function addNumber(name:String, number:String):void {
        indicies.numberToName[number] = name;
        indicies.nameToNumber[name] = number;
    }

    public function getName(number:String):String {
        return indicies.numberToName[number];
    }

    public function getNumber(number:String):String {
        return indicies.nameToNumber[number];
    }
}

ネストされたリテラル全体がインスタンスごとに新しく作成されますか、それとも異なるindiciesオブジェクトが同じオブジェクトを共有しnumberToNameますか?


一般に、プロパティがオブジェクトリテラルのデフォルトを持つクラスのプロパティ間にはありますか...

class MyClass {
    private var myProperty:Object = { a: [1, 2, 3], b: { d: 4, e: 5 } };
}

...そしてコンストラクターでそれを初期化するもの?

class MyClass {
    private var myProperty:Object;
    public function MyClass() {
        myProperty = { a: [1, 2, 3], b: { d: 4, e: 5 } };
    }
}
4

2 に答える 2

0

クラスのインスタンスを作成すると、独自の変数が作成されます。

それで

var class_a:AddressBook = new AddressBook();
var class_b:AddressBook = new AddressBook();

class_a.var = 1;
class_b.var = 2;
trace(class_a.var) //traces 1.
于 2012-11-01T15:56:20.353 に答える
0

完全に新しいオブジェクトが作成され、再利用されることはありません。AddressBook単純なものを使用する場合でも、ネストされたオブジェクトリテラルを使用する場合でも、同じ結果が得られます。

trace("None instantiated yet.")

var a:* = new AddressBook;
trace("A instantiated.");

var b:* = new AddressBook; 
trace("B instantiated.");

a.addNumber("John", "555-5555");
trace(a.getNumber("John")); // prints 555-5555
trace(b.getNumber("John")); // prints null

オブジェクトリテラル内にブレークポイントを設定します。初めて壊れたときの出力は?

None instantiated yet.

2回目?

None instantiated yet.
A instantiated.

オブジェクトリテラルは、インスタンスが作成されるたびに評価され、それ以外のときは評価されません。

残念ながら、私はこの振る舞いの決定的なリファレンスを見つけることができませんでした。ActionScriptの「仕様」には十分な詳細が含まれていません。より良い参考文献をいただければ幸いです。

于 2012-11-01T16:01:29.247 に答える