-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对象,导致一个对象的所有更改也适用于其他对象?


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

第二次?

None instantiated yet.
A instantiated.

每次创建实例时都会评估对象文字,并且不会在其他时间进行评估。

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

于 2012-11-01T16:01:29.247 回答