Как вы узнаете вызывающий объект в JavaScript - PullRequest
2 голосов
/ 04 ноября 2011

у меня

 var X={
     method1 : function(){
                A();
              },
     method2 : function(){
                A();
              },

    }

function A(){
       console.log('im from methodNAME of ObjNAME ');
}

Как узнать имя метода и объекта , из которого вызывается функция .?

Ответы [ 2 ]

5 голосов
/ 04 ноября 2011

Вы можете использовать arguments.caller, но это не надежно: https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope/arguments/caller

Он был заменен на https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/caller, который, кажется, имеет разумную поддержку браузера.

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

То, как вы определили и назвали свою A функцию, объект, для которого вызывается A, будет DOMWindow объектом, то есть глобальным объектом.

Что касается того, из какого метода X он называется (это то, что вы подразумеваете под methodNAME, я полагаю) - так, как вы определили свои методы (определяя анонимную функцию и назначая ir свойству), вы не сможете получить имя.

Если бы вы объявили свой X объект следующим образом:

var X = {
    method1: function method1() {
        A();
    },
    method2: function method2() {
        A();
    },

}

и ваша A функция выглядит следующим образом:

function A() {
    console.log(A.caller);
}

затем вызывается:

X.method1();
X.method2();

выдаст консольный вывод, подобный следующему:

function method1() {
        A();
    }

function method2() {
        A();
    }

, который затем можно будет проанализировать и получить имя вызывающего метода.

Или, если вы определили A какэто:

function A() {
    console.log(A.caller.prototype);
}

, тогда вывод будет отображать:

method1
method2

, где method1 и method2 - объекты-прототипы - так что вам также придется выполнить некоторые манипуляции.

РЕДАКТИРОВАТЬ: исправлено неверное копирование / вставка = A.caller.prototype -> A.caller.

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