ActionScript上的可调用对象?

时间:2010-04-28 17:21:51

标签: flex actionscript-3

是否可以在ActionScript中拥有可调用对象?例如:

class Foo extends EventDispatcher
{
  Foo() { super(); }

  call(world:String):String
  {
    return "Hello, " + world;
  }
}

后来......

var foo:Foo = new Foo();
trace( foo("World!") );    // Will NOT work

5 个答案:

答案 0 :(得分:0)

注意:构造函数和方法声明都错过了关键字 public function 甚至编译,但我想这不是原始代码。 :)

答案是:你不能。
我的问题是:你想要完成什么?

Function是唯一可调用的值。 Function是ActionScript中的原语,与int s或Boolean s一样,因此没有有意义的方法来扩展它们。

如果你想让它成为一个对象,那就用Java方式,定义一个ICallable接口,实际调用一个方法,或者只是真正使用一个函数。如果你想要的话,闭包提供了创建有状态函数的最简单和灵活的可能性。

编辑好吧,你可以这样做(例如):

private var fooInst:Foo = new Foo();
protected var foo:Function = fooInst.call;

然后按照您的意愿进行以下工作:

<mx:Label text="{foo('Whatever')}"/>
虽然你失去了严格打字的好处,但它甚至可能更灵活一些。

格尔茨
back2dos

答案 1 :(得分:0)

你为什么需要这样做? (我不批评,只是感兴趣!)AS3中的函数本身就是一等公民,可以作为参数传递。

e.g。

public function main(foo:Function):void
{
    trace(foo("World!")); // Will work, assuming foo = function(str:String):String {...}
}

答案 2 :(得分:0)

不,只能以这种方式调用函数/方法。如果唯一的原因是您想要输入更少的字符,那么您应该缩短实例名称和方法名称的长度。

答案 3 :(得分:0)

正如其他人所说,你不能拥有可调用的对象。但是,如果由于某种原因你想要有状态函数,你可以借助静态类变量和包级函数来实现它。例如:

// com/example/foo/Helper.as
package com.example.foo {
    public class Helper {
        private static var _instance:Foo;

        public static var data:String;

        public static function get instance():Helper
        {
            if(!_instance) { _instance = new Helper(); }
            return _instance;
        }
    }
}

// com/example/foo/hello.as
package com.example.foo {
    public function hello(world:String):void
    {
        if(Helper.instance.data)
        {
            trace("Bye, " + Helper.instance.data);
        }
        trace("Hello, " + world);
        Helper.instance.data = world;
    }
}

使用时会打印不同的东西。

hello("World!");   // traces "Hello, World!"
hello("People");   // traces "Bye, World!" and "Hello, People"

答案 4 :(得分:0)

一种选择是使用闭包:

public function Foo():Function {
    var bar:String;
    return function (world:String):String {
        var msg:String;
        if (bar) {
            msg = bar + ' says "Hello, ' + world + '"';
        } else {
            msg = "Hello, " + world;
        }
        bar = world;
        return msg;
    }
}
...
var foo = Foo();
trace( foo("World!") );

这是将对象实现为函数的更大模式的简化情况。因此,它在支持FP但不支持OOP的语言中更有用,但在技术上会给你一个可调用的“对象”。语法可能稍微偏离,但是:

public function createFoo(barInit, ...):Function {
    var slots = {
        greeter: barInit, ...
    };
    var methods = {
        'get': function(name) { return slots[name]; }
        'set': function(name, value) { slots[name] = value; }
        greet: function(whom) {
            var msg = slots.greeter + ' says "Hello, ' + whom + '"'
            slots.greeter = whom;
            return msg;
        },
        ...
    };
    return function (method:String):* {
        args = Array.splice.call(arguments, 1);
        return methods[method].apply(null, args);
    }
}

var foo = createFoo('Kermit');
trace(foo('greet', "World"));
trace(foo('greet', "Sailor"));

你可能不想在AS中这样做。