JavaScript можно использовать строку для вызова функции объекта - PullRequest
0 голосов
/ 05 ноября 2011

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

 var string = "save";

 var generic = (new function (string) { 

                string."alert()";


               return this;
               })




 var save = (new function (string) { 

    this.alert = (function () {

              alert("your document has been saved")                    

              return this         

              })

        return this 
          })

var notSaved = (new function (string) { 

    this.alert = (function () {

              alert("your document has not been saved")                    

              return this         

              })

        return this 
          })

Я использую ее для гораздо более сложного наборавверх, но вот пример.Возможно ли это?

Ответы [ 4 ]

1 голос
/ 05 ноября 2011

Глядя на ваш код, трудно сказать, чего вы на самом деле пытаетесь достичь . Тем не менее, вот несколько идей, которые могут иметь отношение.

Сначала давайте создадим пару объектов:

var rabbit = {
  name: 'Peter',
  hop: function () {
    return this.name + ' hopped!'
  },
  jump: function () {
    return this.name + ' jumped!'
  }
}

var hairy_maclary = {
  name: 'Hairy Maclary',
  jump: function () {
    return this.name + ' jumped over the fence!'
  }
}

Теперь вы можете определить функцию, которая вызывает метод hop в зависимости от того, какой объект ему передан:

function hop(object) {
  return object.hop()
}

hop(rabbit) // 'Peter hopped!'

Я не уверен, почему вы сделали бы это, вместо того, чтобы напрямую вызывать hop, но, возможно, вы захотите сделать дополнительные вещи до или после.

Если вы хотите, вы можете создать полностью общую функцию, которая будет вызывать данный метод для данного объекта:

function invokeMethod(object, method) {
  object[method]()
}

invokeMethod(hairy_maclary, 'jump') // 'Hairy Maclary jumped over the fence!'

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

1 голос
/ 05 ноября 2011

Конечно, вы можете. Попробуйте что-то вроде этого:

window[string].alert();
0 голосов
/ 05 ноября 2011

eval ("alert ('test');");

Вы можете вызывать функции с помощью eval.Даже вы можете объявить функции.

eval ("function test () {alert (" test ");}");

test ();

0 голосов
/ 05 ноября 2011

Вы можете заключать свои функции в некоторый объект , чтобы вы могли получить доступ, передавая имя свойства с использованием некоторой переменной (в данном случае с именем string), например.вот так:

var string = 'notSaved';
var funcs = {};

funcs.save = new function(){
    this.alert = function(){
        alert('called save.alert()');
    };
    return this;
};

funcs.notSaved = new function(){
    this.alert = function(){
        alert('called notSaved.alert()');
    };
    return this;
};

funcs[string].alert();

См. рабочий пример для jsfiddle .

Если ваши переменные глобальные (они не должны), они такжеавтоматически включается в window объект, поэтому вы можете также вызывать их так: window[string].alert().Это не будет работать для неглобальных функций (в данном случае мое решение кажется единственным, не использующим eval()).

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