2014-01-12 4 views
2

Вот что я хочу:Получить имя экземпляра класса внутри класса

var Validator = function() { 
    this.do = function() { 
     alert(INTANCENAME); /// SHOULD BE 'FOO' 
    } 
} 
var FOO = new Validator().do(); 

ли possibe реализовать в JavaScript?

+0

Зачем вам это нужно? – zerkms

+0

Не побеждает ли объект объектов в первую очередь? – BenM

+4

Я не думаю, что 'FOO' - это имя экземпляра, а не имя переменной, которую экземпляр в настоящее время хранит. –

ответ

2

Правда есть нет смысла делать это, единственный способ, которым я едва могу думать, чтобы петля все window или область применения объектов и проверить какое-то равенство с текущим объектом, что-то вроде

this.do = function() { 
    for(var key in window) { 
     if(this === window[key]) { 
      alert(key); 
     } 
    } 
}; 

Чтобы работать, вызовите его после его назначения.

var FOO = new Validator(); 
FOO.do(); 

Другой вопрос, который может придумать, что экземпляр (ссылка) может быть сохранен в различных переменных, поэтому, возможно, не получит то, что вы ожидаете.

+0

Это работает, есть альтернатива, но похожее решение здесь http://stackoverflow.com/questions/2462199/javascript-list-global-variables-in-ie/2462341#2462341 –

1

Невозможно прямо сделать то, что вы просите здесь. Объекты сами по себе не определены в их имени сопоставимой переменной - на самом деле возможно иметь объекты, которые существуют, которые непосредственно не привязаны к переменной, и несколько переменных, назначенных одному и тому же объекту.

Интерпретатор javascript использует наши имена переменных в качестве идентификаторов, чтобы помочь с выполнением кода, но как только он запускает имя переменной, не имеет никакого значения для работающей javascript-программы, поскольку, вероятно, это сократилось до ссылки на память к моменту ее выполнения , полностью отделен от исходного кода, который вы написали.

Редактировать: Answer by yannis делает вид симулировать это, но он полагается на работу с переменными, доступными в определенной области действия - что я имел в виду, что нет прямого способа сделать это из самого объекта в соответствии с вашим примером в вопрос.

1

Дословный ответ на ваш вопрос будет:

  1. Используйте (new Error()).stack, чтобы получить информацию о линии и функции, в которой был вызван метод do().
  2. Используйте JS-парсер (например, Esprima), чтобы узнать, какую переменную он вызывал (если таковой имеется, сам метод может быть назначен переменной).

Я не рекомендую это делать.

Смежные вопросы