2012-11-01 42 views
-1

如果我在ActionScript中將對象文字用作屬性的默認值,是否會創建一個單個對象,該對象由所有實例引用或每個實例都有一個新對象?使用對象文字作爲ActionScript 3類的默認屬性值

例如,如果我創造了這個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實例確實得到自己的對象,這是可以想象的那一剎那可能只適用於較淺這種行爲。考慮嵌套對象文字的默認:

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

了var沒有被設置爲靜態的,所以每個新的實施將導致在編譯時在類設置的默認值,其在這種情況下,僅僅是與2個屬性是空對象的對象。 –

+0

但是在這種情況下,我會建議將「indicies」抽象到它自己的類中 –

回答

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「規範」不包含足夠的細節。更好的參考將不勝感激。

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.