Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Проверка существования метода (https://javascript.ru/forum/misc/26900-proverka-sushhestvovaniya-metoda.html)

alex1covo 26.03.2012 22:49

Проверка существования метода
 
Доброе время суток!

Помогите пожалуйста проверить существование метода объекта, если название объекта и метода приходят в строке. Например вот так

var Test = {
   Test : function(){ }
}

var v = 'Test.Test';

//1
alert( typeof v == 'function' ); //false, оно и понятно почему

//2
eval( "alert( typeof "+v+" == 'function' );" ) //true, но помоему это не очень хорошо


Вопрос заключается в том, как исполнить проверку используя typeof, но без eval-а?

devote 26.03.2012 23:08

var Test = {
   Test : function(){ }
}
 
var v = 'Test.Test';
 
//1
alert( typeof v == 'function' ); //false, оно и понятно почему
 
//2
eval( "alert( typeof v == 'function' );" ) //false

devote 26.03.2012 23:12

Цитата:

Сообщение от alex1covo
Вопрос заключается в том, как исполнить проверку используя typeof, но без eval-а?

var Test = {
   Test : function(){ }
}
  
var v = 'Test.Test';
alert( typeof ( new Function('return ' + v)() ) == 'function' );

alex1covo 26.03.2012 23:21

Принцип, ясен. Спасибо!

Раед 27.03.2012 00:38

devote, это по сути тот же eval, только сыммитированный через Function

devote 27.03.2012 00:45

Цитата:

Сообщение от Раед
devote, это по сути тот же eval, только сыммитированный через Function

а кто спорит? он просил без eval я ему дал без eval. Все вполне честно :)

alex1covo 27.03.2012 16:46

Мне понятно, что создание анонимной функции с помощью new Function это тот же eval.

Решил спросить потому, что кроме eval в голову приходил вариант с возвратом ссылки на метод:

var Test = {
   Test : function(){ alert( 'Hello' ) }
}
    
var v = 'Test.Test';

//для простоты без всяких проверок
function _( v ){
   var w = window;
   v = v.split( '.' );
   for( i in v ) w = w[ v[ i ] ]
   return w;
}

alert( typeof _( 'Test.Test' ) ); //function

//вызов
_( 'Test.Test' )(); //Hello


Хотелось как-то попроще, думал синтаксис позволяет. Наверное мой случай это когда надо использовать eval. Для простоты.


Часовой пояс GMT +3, время: 22:06.