Использование функции для создания объекта в actionscript 3.0 - PullRequest
4 голосов
/ 22 января 2009

Поскольку actionscript 3.0 основан на ECMAscript, он имеет некоторые сходства с javascript. Одним из таких сходств, с которыми я играю, является создание объектов из функций.

В javascript для создания объекта,

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

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

В actionscript 3.0 Объекты обычно создаются через класс, но объекты могут создаваться, как в javascript, через функции конструктора.

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;
}

Однако я получаю ошибку компиляции с кодом выше

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 );
                                            ^

Мне было интересно, почему это так? Чтобы сделать вещи еще более странными, следующий код работает

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);
}

Выход для этого кода

33
undefined
undefined

Ответы [ 2 ]

6 голосов
/ 22 января 2009

Синтаксически, это одна область (среди многих), где два расходятся. ;)

Вы можете создать объект, используя функцию:

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.

... только с немного другим синтаксисом. Класс Function также является динамическим, что означает, что вы можете прививать методы к его экземплярам во время выполнения (как я делал выше с sayHi ()), так же, как вы можете использовать свойство «prototype» JavaScript.

На самом деле я не уверен, с какими раздражениями, именами коллизий, странностей и т. Д. Вы можете столкнуться с этим подходом, поскольку я еще не углубился в его документацию - но он работает !

1 голос
/ 22 января 2009

Вы должны объявить Студента в своем собственном классе в файле. Таким образом, ученик доступен в любом месте в пределах Main.

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;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...