Flex / AS3 - динамический вызов функции с использованием строки? - PullRequest
14 голосов
/ 20 декабря 2010

Можно ли вызвать функцию в AS3, используя строковое значение в качестве имени функции, например,

var functionName:String = "getDetails";

var instance1:MyObject = new MyObject();

instance1.functionName(); // I know this is so wrong, but it gets the point accross:)

ОБНОВЛЕНИЕ

Ответ @Taskinoor при доступефункция верна:

instance1[functionName]();

И для доступа к свойству мы будем использовать:

instance1[propertyName]

Ответы [ 3 ]

24 голосов
/ 20 декабря 2010
instance1[functionName]();

Проверьте это для некоторых деталей.

2 голосов
/ 30 октября 2013

Вместо этого вы можете использовать методы function.apply () или function.call (), если вы не знаете, например, есть ли у объекта такой метод.

var functionName:String = "getDetails";
var instance1:MyObject = new MyObject();
var function:Function = instance1[functionName]
if (function)
    function.call(instance1, yourArguments)
1 голос
/ 07 января 2015

Я создал следующие обертки для вызова функции. Вы можете вызвать его по имени или по фактической функции. Я пытался сделать их максимально подверженными ошибкам.

Следующая функция преобразует имя функции в соответствующую функцию с учетом области видимости.

public static function parseFunc(func:*, scope:Object):Function {
    if (func is String && scope && scope.hasOwnProperty(funcName)) {
        func = scope[func] as Function;
    }
    return func is Function ? func : null;
}

Вызов

Подпись : call(func:*,scope:Object,...args):*

public static function call(func:*, scope:Object, ...args):* {
    func = parseFunc(func, scope);
    if (func) {
        switch (args.length) {
            case 0:
                return func.call(scope);
            case 1:
                return func.call(scope, args[0]);
            case 2:
                return func.call(scope, args[0], args[1]);
            case 3:
                return func.call(scope, args[0], args[1], args[2]);
            // Continue...
        }
    }
    return null;
}

Применить

Подпись : apply(func:*,scope:Object,argArray:*=null):*

public static function apply(func:*, scope:Object, argArray:*=null):* {
    func = parseFunc(func, scope);
    return func != null ? func.apply(scope, argArray) : null;
}

Примечания

Вызов

Переключатель необходим, потому что и ...args, и arguments.slice(2) являются массивами. Вам нужно вызвать Function.call() с переменными аргументами.

Применить

Встроенная функция (apply(thisArg:*, argArray:*):*) использует нетипизированный аргумент для argArray. Я просто отказываюсь от этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...