Ссылка на собственный конструктор во внутренней функции

Вот игрушечный пример из сложного класса:

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 решения для вас.

  1. Если бы ваш метод makeObject не был статическим, он бы работал.

  2. Объявите вашу анонимную функцию другим способом:

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

И вы не можете снова вызвать конструктор класса, используйте функцию, которая вызывается в конструкторе, а затем вызовите ее снова. При этом вы не ссылаетесь на конструктор, а создаете новый экземпляр класса.

Другие вопросы по тегам