2015-10-12 1 views
1

Я пытаюсь изучить ООП самостоятельно, используя AS3, и я поставил перед собой задачу для этой цели. Поскольку он довольно сложный, я пытаюсь понять полезные инструменты в AS3.Что не так в моем примере использования метода «вызова» в ActionScript 3?

Во всяком случае, метод function.call (AS3 API doc. here) выглядит довольно интересным, и я думаю, что смогу использовать его, однако я, по-видимому, не полностью понимаю, что он делает и как он работает , Кажется, что у JavaScript есть эквивалент, который выглядит довольно простым в использовании. (Я видел this other thread с тем же вопросом, что и у меня, но в JS)

Вот пример того, что я думал о function.call.

package 
{ 
    import flash.display.Sprite 

    public class Main extends Sprite 
    { 

     public var foo:Foo; 
     public var bar:Bar; 

     public function Main() 
     { 
      foo = new Foo(); 
      bar = new Bar(); 

      trace(bar.barProperty); //Hello World! 

      //I expect the 'foo.BarProp' to be called with this==bar. 
      foo.value = foo.BarProp.call(bar); //ReferenceError: Error #1069: Property barProperty not found on Main.as$0.Foo and there is no default value. 

      trace(foo.value); //Expected output: Hello World! 
     } 

    } 

} 

class Foo { 

    public var value:String; 

    public function Foo() {} 

    public function BarProp():String { 
     return this.barProperty; 
    } 
} 

class Bar { 

    public var barProperty:String = "Hello World!"; 

    public function Bar() {} 
} 

Все правильно, так что это, что я просто не получаю?

ответ

3

Прежде всего, return this.barProperty должен указывать ваши ошибки при компиляции, поскольку на картинке нет кода barProperty.

Прежде всего, я не думаю, что Function/call() может изменить значение this для методов класса экземпляра. Он работает для функций объекта:

var foo:Object = { 
    getBarProperty: function(){ 
     return this.barProperty; 
    } 
} 

var bar:Object = { // or use your Bar class 
    barProperty: "Hello World" 
} 

trace(foo.getBarProperty.call(bar)); // "Hello World" 

foo.getBarProperty(); // "undefined", because "foo" does not have a "barProperty" 

Это так же, как Javascript, но Javascript не имеет классы и функции, например, и this is infamously not always lexical, поэтому использование call() и apply() с thisArg более распространенной практикой. Примерно через 10 лет разработки ActionScript 3 я не могу вспомнить, как только нужно было использовать call() с другим thisArgument.

+0

1) Я не получал ошибку, потому что мой компилятор не находится в строгом режиме. 2) Я никогда не делал разницы между методом класса и объектом функции. Благодаря! –