Как получить имя класса JavaScript - PullRequest
4 голосов
/ 16 марта 2011

Давайте возьмем следующий пример кода:

var ns = {}; // Some namespace

ns.Test = function()
{
    // Constructor of class Test
};

var inst = new ns.Test();
var className = hereIsTheMagic(inst); // Must return "ns.Test"

Поэтому я создаю класс с именем «Test» в пространстве имен «ns» и экземпляр этого класса с именем «inst». Теперь я хочу узнать имя класса. Как я могу это сделать?

До сих пор я решал эту проблему, дав каждому классу строковое свойство с именем класса, чтобы я мог использовать inst.constructor.className для доступа к имени класса. Но если возможно, я бы хотел прекратить делать это, потому что это довольно подвержено ошибкам при копировании / вставке классов.

Если не существует решения, которое работает во всех текущих браузерах, возможно, есть какая-то новая функция в будущей спецификации ECMAScript, которая предоставляет доступ к именам классов?

1 Ответ

8 голосов
/ 16 марта 2011

JavaScript не имеет классов, у него есть функции конструктора и цепочка прототипов. Вместе они могут выглядеть как классы, но на самом деле это не так. : -)

Нет, нет стандартного способа, которым hereIsTheMagic может найти строку "ns.Test" в вашем примере, даже в ECMAScript 5. С одной стороны, ns.Test может быть не единственным свойством, относящимся к этой функции ( что, если вы добавили ns.OtherTest = ns.Test;, например).

В JavaScript есть концепция функций , имеющих собственные имена, но нет стандартного способа получить доступ к правильному имени функции, и даже если бы вы могли, функция, которую вы вызываете ns.Test, анонимный . Свойство, которому вы присвоили его в ns, имеет имя (Test), но функция - нет.

Вы можете дать функции имя:

var ns = {}; // Some namespace
(function() {
    ns.Test = ns_Test;

    function ns_Test() {
    // Constructor of class Test
    }
})();

... это хорошая идея, потому что помогает инструментам помочь вам , но нет никакого стандартного способа для самого кода JavaScript получить это имя. (Не делайте ns.Test = function ns_Test() { ... };, хотя. Это должно работать, но есть различные реализации ECMAScript, которые имеют различные ошибки, связанные с ним. Подробнее об этом в статье, указанной выше .)


Обновление : Я, вероятно, должен был сказать: есть нестандартных способа получить правильное имя функции (ns_Test в моем примере выше).

Самым простым из них является свойство name в экземплярах функций, которое поддерживается многими реализациями, включая:

  • Firefox's SpiderMonkey
  • Chrome V8
  • Движок оперы (я не знаю его названия)
  • Движок Safari (включая Safari mobile)

... поэтому alert(ns_Test.name); выдаст предупреждение «ns_Test». Но он не -стандарт и не поддерживается ни одной версией JScript (движок Microsoft), даже не версией, используемой IE9 (теперь наконец-то выпущенной!). Вот страница быстрого теста: http://jsbin.com/oxuva3

Обратите внимание, что опять-таки это правильное имя функции (см. Мой пример выше), а не имя свойства, которому вы ее присвоили.

Если name нет, вы можете использовать toString() для объекта функции, который может (или не может) возвращать строковое представление функции (например, "function ns_Test ( ) {...} "). Это совершенно нестандартно, но часто встречается в настольных браузерах; это не работает на нескольких мобильных браузерах, и, вероятно, плохая идея в любом случае. : -)

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