如何使类构造函数可以作为函数调用?

时间:2010-12-01 18:08:11

标签: flash actionscript-3 actionscript

某些顶级类可以实例化,也可以作为函数调用(e.x. new Number() and Number()new Boolean() and Boolean()new Array() and Array())。

通常这用于类型转换或实例化的快捷方式。我希望能够做同样的事情:

public class Foo
{
  public function Foo():void
  {
    //do something
  }
}

public function Foo():Foo
{
  //do some stuff;
  return new Foo();
}

这可能吗?如果是这样,怎么样?

编辑澄清:

我最初想做的是创建一个与Flash / JavaScript交互的日志类,并且是跨浏览器兼容的。我希望能够使用log function 作为log 中方法的别名。这让我想知道是否可以实现自定义转换功能只是因为。我现在意识到这是不可能的,但无论如何都很有趣。

2 个答案:

答案 0 :(得分:1)

您可以定义类:

package [package name]
{
  public class Foo
  {
    public function Foo():void
    {
      //do stuff
    }
  }
}

您可以定义功能:

package [package name]
{
  public function Foo():Bar
  {
    return new Bar();
  }
}

但是类和函数不能有命名冲突。否则你会收到脚本错误。

无法使用与该类相同的名称定义自定义强制转换函数,但可以使用其他名称实现:

package [package name]
{
  public function CastFoo(foo:*):Foo
  {
    //do stuff
    return Foo(foo);
  }
}

答案 1 :(得分:0)

这是正确的:

public class Foo
{
  public function Foo():void
  {
    //do something
  }
}

这不是:

public function Foo():Foo
{
  //do some stuff;
  return new Foo();
}

如果您在Foo之前​​加上“new”:

new Foo();

你创建了一个Foo类的新实例。

如果你不这样做:

Foo();

你什么也得不到 - 实际上,你会得到一个关于缺少参数的编译器错误。

如果你传递一个参数:

var foo:Foo = Foo(bar);

你会把“bar”作为Foo的一个实例。要转换的对象必须共享要转换的超类。通常它用于将更通用的对象类型转换为更具体的对象类型 - 例如将event.target作为Sprite或将getChild返回的DisplayObject转换为MovieClip。