JavaScript: вызвать функцию или вызвать свойство через отражение - PullRequest
3 голосов
/ 22 декабря 2009

Есть ли способ вызвать функцию (или свойство) объекта с помощью отражения в JavaScript?

Допустим, что во время выполнения мой код уже определил, что objectFoo действительно имеет свойство с именем 'bar'. Теперь, когда мой код знает это, я хочу сделать следующее. Обычно я бы сделал это: var x = objectFoo.bar. Но 'bar' был определен во время выполнения, поэтому мне нужно вызвать его с помощью отражения.

Ответы [ 4 ]

6 голосов
/ 22 декабря 2009

В JavaScript методы объекта - это просто свойства, содержащие функции.Как и все свойства, вы можете ссылаться на них, используя синтаксис ассоциативного массива:

var x = { 'a': 1 };
x.a += 1;
x['a'] += 1;
console.log(x.a);

Вывод: 3.

Так что если у вас есть имя метода, который вы хотите вызвать наmyObject:

var methodName = 'myMethod';

// Invoke the value of the 'myMethod' property of myObject as a function.
myObject[methodName]();
4 голосов
/ 04 августа 2011

Создать объект (вызвать конструктор) с помощью отражения:

SomeClass = function(arg1, arg2) {
    console.log('Your reflection');
}

ReflectUtil.newInstance('SomeClass', 5, 7);

и реализация:

var ReflectUtil = {};

/**
 * @param strClass:
 *          class name
 * @param optionals:
 *          constructor arguments
 */
ReflectUtil.newInstance = function(strClass) {
    var args = Array.prototype.slice.call(arguments, 1);
    var clsClass = eval(strClass);
    function F() {
        return clsClass.apply(this, args);
    }
    F.prototype = clsClass.prototype;
    return new F();
};
4 голосов
/ 22 декабря 2009

EVAL: http://www.w3schools.com/jsref/jsref_eval.asp

Eval позволит вам запустить любой код javascript, передав строку и заставив механизм javascript оценить его как код javascript.

Если вы имеете в виду, что хотите сначала выполнить поиск в списке свойств объекта, посмотрите на это:

var o = {}
for(att in o){
    alert(o[att]);
}

Если вы сделаете это, вы даже можете установить значение свойства, обращаясь к нему как к массиву (все объекты на самом деле являются ассоциативными массивами).

obj["propertyName"] = "new value";
obj["MethodName"]();
0 голосов
/ 07 октября 2016

Создать объект реестра:

var funcRegister = {};

Создание функции для вызова другой:

var callReflectionFunc = function(type, obj) {
    var func = false;
    if(funcRegister[type])
        func = funcRegister[type](obj);

    return func;
}

Заполните ваш регистр функциями:

funcRegister['yourtype1'] = function(obj) {
    console.log('your type 2');

    return obj;
}

funcRegister['yourtype2'] = function(obj) {
    console.log('your type 2');

    return obj;
}

Затем назовите его своим типом и объектом, куда вы можете поместить свои аргументы

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