2008-10-16 17 views
5

Es ist ein wenig schwierig, nach 'var: *' zu suchen, weil die meisten Suchmaschinen es nicht finden werden.Was genau bedeutet var x: * in ActionScript?

Ich bin nicht ganz klar, was var: * Mittel, im Vergleich var zu sagen: Object

Ich dachte, es würde mir beliebige Eigenschaften auf ein Objekt wie setzen lassen:

var x:* = myObject; 
x.nonExistantProperty = "123"; 

aber das gibt mir ein Fehler:

Property nonExistantProperty not found on x 

Was bedeutet * genau?

Edit: Ich reparierte die ursprüngliche var: * auf die richtige var x: *. Verlor meine Internetverbindung

Antwort

1

Es ist die "untypisierte" Art. Es bedeutet nur, dass die Variable von jedem Typ sein kann. Grundsätzlich der gleiche Effekt wie bei der Verwendung dieser:

1

Es bedeutet, dass der Typ nicht angegeben ist und mit jedem Typ verwendet werden kann. Sie können jedoch keine zufälligen Eigenschaften festlegen. Es verhält sich wie jeder Typ, auf den Sie es einstellen. Die genaue Syntax lautet:

2

Es ist eine Möglichkeit, eine nicht typisierte Variable anzugeben, so dass Sie grundsätzlich einen beliebigen Typ zuweisen können. Der Code

var x:* = oneTypeObject; 

erstellt die Variable x ordnet dann die oneTypeObject Variable zu. Sie können aber auch einen ganz anderen Typ zuweisen wie folgt:

var x:* = anotherTypeObject; 

Sie können jedoch nach wie vor nicht willkürlich festgelegt oder Zugriffseigenschaften; Sie müssen im zugrunde liegenden Typ existieren (entweder oneTypeObject oder anotherTypeObject).

Beide Typen können identische benannte Eigenschaften haben, was bedeutet, dass Sie auf diese Eigenschaft in x zugreifen oder festlegen können, ohne sich mit dem zugrunde liegenden Typ befassen zu müssen.

12

Erweiterung auf die anderen Antworten, etwas mit dem Sternchen zu deklarieren ist genau das gleiche wie es untypisiert verlassen.

var x:* = {}; 
var y = {}; // equivalent 

jedoch die Frage, ob Sie berechtigt sind, nicht existierende Eigenschaften zu Objekten zuordnen, hat nichts mit der Art der Referenz zu tun, und wird dadurch bestimmt, ob das Objekt eine Instanz eines dynamischen Klasse.

Da zum Beispiel Object dynamisch und String ist nicht:

var o:Object = {}; 
o.foo = 1; // fine 
var a:* = o; 
a.bar = 1; // again, fine 

var s:String = ""; 
s.foo = 1; // compile-time error 
var b:* = s; 
b.bar = 1; // run-time error 

Hinweis, wie Sie immer wieder neue Eigenschaften zum Objekt zuweisen können, unabhängig davon, welche Art von Referenz Sie verwenden. Ebenso können Sie dem String keine neuen Eigenschaften zuweisen, aber wenn Sie einen typisierten Verweis verwenden, wird dies vom Compiler abgefangen, und bei einem nicht typisierten Verweis weiß der Compiler nicht, ob b dynamisch ist oder nicht, daher tritt der Fehler auf zur Laufzeit.

übrigens doc Bezug auf Typ-Sternchen sind hier zu finden:

http://livedocs.adobe.com/labs/air/1/aslr/specialTypes.html# *

(. Das Markup-Engine weigert, das Linkify, weil der Stern)

0

Wie bereits erwähnt, ist es nicht typisiert, sodass es beliebige Daten enthalten kann. Sie können es jedoch nicht als Operationen behandeln. Zum Beispiel ist dies gültige Code:

var untyped:* = functionThatReturnsSomeValue(); 

Aber wenn man einen Schritt weiter gehen, müssen Sie aufpassen, oder Sie könnten gebissen:

var name:String = untyped.name; 

Nun, wenn das Objekt von dieser Funktion zurück zufällig ein Objekt mit einem Feld mit einer ID von "Name" ist, bist du im Klaren. Wenn Sie jedoch nicht sicher sind, dass dies der Fall ist, ist es besser, typisierte Objekte zu verwenden. Auf diese Weise wird der Compiler Sie warnen, wenn Sie etwas tun, das zur Laufzeit einen Fehler verursachen könnte: