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 ( ) {...} "). Это совершенно нестандартно, но часто встречается в настольных браузерах; это не работает на нескольких мобильных браузерах, и, вероятно, плохая идея в любом случае. : -)