Подтвердить что ты не робот

Как получить имя конструктора в JavaScript?

Предположим, что следующая программа:

var C = function() { };
x = new C();

Выражение x instanceof C дает True, поэтому x должно каким-то образом знать, что оно было создано функцией C. Есть ли способ получить имя C непосредственно из x?

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

4b9b3361

Ответ 1

В Chrome (7.0.544.0 dev), если я это сделаю:

function C() { }

var x = new C();

console.log(x.constructor.name);

он печатает "C"... но если C определен как неназванная функция, как у вас есть, он будет печатать пустую строку вместо этого.

Если я печатаю x.constructor, он печатает то же самое, что и в случае, если напечатаю C в коде, который у вас есть. Оператору instanceof нужно сравнить только эти два значения, чтобы убедиться, что они равны, чтобы вернуть true.

Ответ 2

Этот код получит имя конструктора, если это не анонимная функция:

obj.constructor.toString().match(/function (\w*)/)[1];

Зачем вам нужно имя класса? Предположим, вы хотите сохранить и восстановить экземпляры классов через JSON. Вы можете сохранить имя класса в свойстве "type", а затем использовать функцию resolver в JSON.parse для восстановления объектов. (См. Пример кода на этой странице).

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

function Foo() {}
Foo.prototype.type = 'Foo';

Это кажется глупым и избыточным, поэтому я начал в квесте, чтобы получить имя класса неявно. Но в конце концов я должен уступить: в JS нет приемлемого решения: - (

Ответ 3

Нет. Вы можете использовать x.constructor, чтобы получить прямую ссылку на C, но это анонимная функция, поэтому нет способа получить ее имя.

Если он был определен следующим образом:

function C() { };
x = new C();

Тогда можно было бы использовать x.constructor.toString() и проанализировать имя функции из возвращаемой строки. Некоторые браузеры также поддерживали бы x.constructor.name [1].

[1] https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/name

Ответ 4

Вы также можете объявить свой класс следующим:

var C = function C() { };

Теперь ваш конструктор класса C уже не является анонимной функцией, которую вы можете сделать:

x = new C();    

console.log(x.constructor.name); // output: C

Ответ 5

Этот код, который должен знать конструктор, может ли он получить доступ к самой функции конструктора? Если это так, вы можете просто сделать этот экземпляр объекта.

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