Ссылка на собственный конструктор во внутренней функции
Вот игрушечный пример из сложного класса:
public class MyClass {
public function MyClass() {
trace('Created');
}
public static function makeObjectAsync(callback:Function):void {
inner();
function inner():void {
var object:MyClass = new MyClass(); // line 10
callback(object);
}
}
}
После вызова статической функции:
MyClass.makeObjectAsync(function(object:Myclass):void { ... })
в строке 10 возникает следующее исключение времени выполнения:
TypeError: Error #1007: Instantiation attempted on a non-constructor.
Почему это так, и что я могу с этим поделать?
редактировать
Похоже, что new (MyClass)()
работает. Теперь я, возможно, более запутался.
2 ответа
Не слишком понятно, ПОЧЕМУ, чтобы быть честным. Это связано с областью, наследуемой анонимными функциями, в зависимости от того, как они объявлены.
У меня есть 2 решения для вас.
Если бы ваш метод makeObject не был статическим, он бы работал.
Объявите вашу анонимную функцию другим способом:
public static function makeObjectAsync(callback:Function):void { var inner : Function = function():void { var object:MyClass = new MyClass(); callback(object); }; inner(); }
Вы не должны называть вашу переменную "объект". Почему вы вложили свою внутреннюю функцию? Почему бы тебе просто:
public static function makeObjectAsync(callback:Function):void {
callback(new MyClass());
}
Или, если вы действительно хотите эту вложенную функцию:
public static function makeObjectAsync(callback:Function):void {
inner();
function inner():void {
callback(new MyClass());
}
}
И вы не можете снова вызвать конструктор класса, используйте функцию, которая вызывается в конструкторе, а затем вызовите ее снова. При этом вы не ссылаетесь на конструктор, а создаете новый экземпляр класса.