如果我在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 } };
}
}
答案 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“规范”不包含足够的细节。更好的参考将不胜感激。