Ответ 1
instance1[functionName]();
Проверьте этот для некоторых деталей.
Можно ли вызвать функцию в AS3 с использованием строкового значения в качестве имени функции, например.
var functionName:String = "getDetails";
var instance1:MyObject = new MyObject();
instance1.functionName(); // I know this is so wrong, but it gets the point accross:)
UPDATE
Ответ от @Taskinoor на доступ к функции правильный:
instance1[functionName]();
А для доступа к свойству мы будем использовать:
instance1[propertyName]
instance1[functionName]();
Проверьте этот для некоторых деталей.
Вместо этого вы можете использовать функции function.apply() или function.call() в том случае, если вы не знаете, имеет ли объект такой метод, например.
var functionName:String = "getDetails";
var instance1:MyObject = new MyObject();
var function:Function = instance1[functionName]
if (function)
function.call(instance1, yourArguments)
Я создал следующие оболочки для вызова функции. Вы можете назвать его по имени или по фактической функции. Я попытался сделать их максимально подверженными ошибкам.
Следующая функция преобразует имя функции в соответствующую функцию с учетом области действия.
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
. Я просто откидываюсь от этого.