是否可以在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
答案 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中这样做。