使用对象文字作为ActionScript 3类的默认属性值

时间:2012-11-01 15:43:38

标签: actionscript-3

如果我在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对象,导致其中一项更改也适用于其他人?


即使每个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 } };
    }
}

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分: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.

第二次?

None instantiated yet.
A instantiated.

每次创建实例时都会评估对象文字,而不是其他时间。

不幸的是,我无法找到这种行为的确切参考。 ActionScript“规范”不包含足够的细节。更好的参考将不胜感激。