4 Stimmen

Verwendung einer Funktion zur Erstellung eines Objekts in Actionscript 3.0

Da actionscript 3.0 auf ECMAscript basiert, weist es einige Ähnlichkeiten mit Javascript auf. Eine dieser Gemeinsamkeiten, mit der ich herumgespielt habe, ist die Erstellung von Objekten aus Funktionen.

In Javascript, um ein Objekt zu erstellen,

var student = new Student( 33 );
document.write( student.age );

function Student( age ){
   this.age = age;
}

In Actionscript 3.0 werden Objekte in der Regel durch Klassen erstellt, aber Objekte können auch, wie in Javascript, durch Konstrukteursfunktionen erstellt werden.

package{
   import flash.display.Sprite;

   public class Main extends Sprite{
      public function Main(){
         var student = new Student( 33 );
         trace( student.age );
      }
   }
}

function Student( age ) {
   this.age = age;
}

Ich erhalte jedoch einen Kompilierfehler mit dem obigen Code

Loading configuration file C:\\Program Files\\Adobe\\Flex Builder 3\\sdks\\3.1.0\\frameworks\\flex-config.xml
C:\\Documents and Settings\\mallen\\Desktop\\as3\\Main.as(5): col: 23 Error: Incorrect number of arguments.  Expected 0

                        var student = new Student( 33 );
                                            ^

Ich habe mich gefragt, warum das so ist? Um die Sache noch merkwürdiger zu machen, funktioniert der folgende Code tatsächlich

package{
    import flash.display.Sprite;

    public class Main extends Sprite{

        public function Main(){
            Student( 33 );

            var student = new Student();
            trace(student.age);

          /* When I add the two lines below, the code wont compile? */
            //var student2 = new Student( 33 );
            //trace(student2.age);
        }
    }
}

function Student( age ){
    this.age = age;
    trace(age);
}

Die Ausgabe für diesen Code lautet

33
undefined
undefined

6voto

Christian Nunciato Punkte 10163

Syntaktisch ist dies ein Bereich (von vielen), in dem die beiden voneinander abweichen ;)

Sie können ein Objekt mit Hilfe einer Funktion erstellen:

private var studentName:String = "Joe";

private function init():void
{
    var s = new Student("Chris");

    trace(s.studentName);
    trace(this.studentName);    
    trace(typeof s);
    trace(typeof Student);

    s.sayHi();
    trace("Hello, " + s.studentName + ". I'm " + studentName + ".");
}

var Student:Function = function(studentName:String):void
{
    this.studentName = studentName;

    this.sayHi = function():void
    {
        trace("Hi!  I'm " + this.studentName + ".");    
    };
};

// Chris
// Joe
// object
// function
// Hi!  I'm Chris.
// Hello, Chris. I'm Joe.

... nur mit einer etwas anderen Syntax. Die Klasse Function ist außerdem dynamisch, d. h. Sie können ihren Instanzen zur Laufzeit Methoden zuweisen (wie ich es oben mit sayHi() getan habe), ähnlich wie Sie die "Prototype"-Eigenschaft von JavaScript verwenden könnten.

Ich bin mir nicht sicher, auf welche Art von Ärgernissen, Namenskollisionen, Merkwürdigkeiten usw. Sie bei diesem Ansatz stoßen könnten, da ich mich noch nicht eingehend mit den Unterlagen dazu befasst habe - aber es funktioniert!

0 Stimmen

JavaScript und ActionScript. (Sieht aus, als hätte ich ein "the" ausgelassen - danke für den Hinweis).

1voto

James Hay Punkte 12299

Sie müssen Student in einer eigenen Klasse innerhalb der Datei deklarieren. Auf diese Weise ist Student überall innerhalb von Main zugänglich.

package{
   import flash.display.Sprite;

   public class Main extends Sprite{
      public function Main(){
         var student = new Student( 33 );
         trace( student.age );
      }
   }
}

class Student
{
   public var age : uint
   public function Student( age : uint ) 
   {
      this.age = age;
   }
}

0 Stimmen

Nein, das macht einen Klassenschüler, ich glaube, Sie haben das falsch verstanden. Funktionen können auch außerhalb von Klassen existieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X