Actionscript 3 AS3 TypeError:错误#1007:尝试在非构造函数上实例化
由于某些原因,我无法使其工作(严重简化的代码失败): 它编译,但在首次访问Actionscript 3 AS3 TypeError:错误#1007:尝试在非构造函数上实例化,actionscript-3,static,typeerror,Actionscript 3,Static,Typeerror,由于某些原因,我无法使其工作(严重简化的代码失败): 它编译,但在首次访问SomeClass时抛出: TypeError: Error #1007: Instantiation attempted on a non-constructor. at com.domain::SomeClass$cinit() ... 您需要生成构造函数并在类中声明变量,而不是在函数中声明变量: package com.domain { public class SomeClass {
SomeClass
时抛出:
TypeError: Error #1007: Instantiation attempted on a non-constructor.
at com.domain::SomeClass$cinit()
...
您需要生成构造函数并在类中声明变量,而不是在函数中声明变量:
package com.domain {
public class SomeClass {
private static var helper:Helper
public function SomeClass() {
helper = new Helper();
}
}
}
class Helper {
}
我认为它不能在同一个文件中同时使用Helper和SomeClass。 初始化SomeClass时,助手类尚未初始化,因此无法创建助手对象 将Helper移动到一个单独的文件应该可以解决这个问题。非构造函数错误是编译器用笨拙的方式说“您为我还没有看到的类调用了构造函数”;如果它稍微聪明一点,它可以在抱怨之前检查文件(编译单元)的内部类。。。迈赫 鉴于您已经为静态变量
private
提供了访问权限,显然您只打算在内部使用实例来SomeClass
(假设;可以作为返回值传递)
以下解决方案将静态变量的创建推迟到内部类初始化时,即调用(可能是隐式的)Helper.cinit()
时,而不是SomeClass.cinit()
当Helper
尚不存在时:
+1给达伦。另一个选项是将
Helper
类移动到文件的顶部
class Helper {
}
package com.domain {
public class SomeClass {
private static var helper:Helper = new Helper();
}
}
他写道,这个例子是“严重简化的失败代码”。我想他有两个分开的文件。实际上,他们应该在同一个文件中@silyevsk,我认为这确实是一个初始化顺序问题。它必须在同一个文件中,这就是你如何创建一个有趣的。。。这似乎是可行的,尽管这种方法意味着您必须先实例化
SomeClass
,然后才能使用静态成员helper
。另外,在实例构造函数中初始化静态成员有点奇怪。例如,如果您创建多个SomeClass
实例,则每次都会重置静态成员。。。不是你想要的。另一个例子是,如果您有一个使用helper
的静态方法,它会发现它是null
,直到您至少实例化一次SomeClass
。至少可以说很奇怪,你不能在构造函数中实例化。因此,您不会每次实例化某个类时都覆盖它,但是当您实例化new Helper()时,您会调用类Helper的构造函数,这就是错误发生的地方。Helper没有构造函数?@Wolv3r:如前所述,您的示例将导致在SomeClass的每个新实例上创建一个新的Helper,这肯定不是静态变量所需要的。同意@Blanka的说法,这非常奇怪,是一个真正的反模式,然而,编译器之所以喜欢它,是因为它在调用构造函数之前有机会初始化Helper
@Wolv3r,AS3支持隐式定义和无参数构造函数的调用。我不知道您可以这样做。还没有机会测试,但如果它有效,这就是它。这很酷,我也不知道你能做到这一点。也就是说,对于我的特定用例,我仍然不认为它会起作用(我还没有测试它tbh)。。。Flex编译器真的应该在编译任何东西之前解析整个文件
package com.domain {
public class SomeClass {
public function doSomething(param:*):void {
// ... use Helper.INSTANCE
}
}
}
class Helper {
public static const INSTANCE:Helper = new Helper();
}
class Helper {
}
package com.domain {
public class SomeClass {
private static var helper:Helper = new Helper();
}
}