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

Flash 如何使类构造函数可以作为函数调用?,flash,actionscript-3,actionscript,Flash,Actionscript 3,Actionscript,一些顶级类可以实例化,也可以作为函数调用(例如newnumber()和Number(),new Boolean()和Boolean(),new Array()和Array()) 通常,这用于类型转换或作为实例化的快捷方式。我希望能够做同样的事情: public class Foo { public function Foo():void { //do something } } public function Foo():Foo { //do some stuff;

一些顶级类可以实例化,也可以作为函数调用(例如
newnumber()和Number()
new Boolean()和Boolean()
new Array()和Array()

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

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

public function Foo():Foo
{
  //do some stuff;
  return new Foo();
}
这可能吗?如果是,怎么做

编辑以澄清:

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

这是正确的:

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

public function Foo():Foo
{
  //do some stuff;
  return new Foo();
}
如果你在Foo前面加上“new”:

创建Foo类的新实例

如果您没有:

Foo();
您什么也得不到-实际上,您将得到一个关于缺少参数的编译器错误

如果只传递一个参数:

var foo:Foo = Foo(bar);

您将把“bar”转换为Foo的实例。要强制转换的对象必须共享要强制转换的超类。通常,它用于将更通用的对象类型转换为更具体的对象类型,例如将event.target转换为精灵,或将getChild返回的DisplayObject转换为MovieClip。

您可以定义类:

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

默认情况下,它应该可以工作。它被称为casting@TiMeister我希望我可以建立一些自定义处理。不幸的是,情况似乎并非如此。只是好奇,但你希望实现什么?这不仅仅是省略了
new
关键字吗?@gthmb我希望别名一个用于调试的类的静态成员,以及纯粹的好奇。@Big MoMo我希望我可以显式重写强制转换的工作方式。使我困惑的是,
Array()。如果严格模式关闭,您将收到警告。。。但我知道你的意思-其他示例可能是setTimeout或navigateToURL,它们总是使用参数而不是“新”实例调用。。。不知道他们为什么用AS3做了更改,因为你可以用原型方法创建的函数对象做你所描述的事情-“新”的力和实例,否则它只是调用。。。总之,很有趣question@BigMoMo
setTimeout
navigateToURL
是ECMA脚本标准中定义的函数,它们与JavaScript相同。对于
Array()
函数也是一样,它是作为对象重载的一个例外。这种混乱是他们引入强制转换新语法的原因之一:
var o:MyObj=(myInstance as MyObj)
。建议大家避免使用旧的语法(我不确定现在是否正式反对使用它)。@zzz-我刚刚提到,它们将实用功能作为某些包的一部分(例如flash.utils.setTimeout),但是使用传统包结构的开发人员无法重新创建。另外,我不认为navigateToURL是ECMA标准的一部分@李-实际上使用“as”的工作方式不同于通过构造函数进行转换。。。变量bob:String=“1”;跟踪(bob作为编号);//无效的跟踪(编号(bob));//1.它绝对不是被弃用的,也不应该被弃用。这两种方法都有作用。
package [package name]
{
  public function CastFoo(foo:*):Foo
  {
    //do stuff
    return Foo(foo);
  }
}