Как получить имя конструктора в JavaScript? - PullRequest
28 голосов
/ 11 октября 2010

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

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

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

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

Ответы [ 6 ]

31 голосов
/ 11 октября 2010

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

function C() { }

var x = new C();

console.log(x.constructor.name);

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

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

9 голосов
/ 02 декабря 2010

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

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

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

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

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

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

3 голосов
/ 11 октября 2010

Нет. Вы можете использовать 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

2 голосов
/ 27 июня 2016

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

var C = function C() { };

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

x = new C();    

console.log(x.constructor.name); // output: C
0 голосов
/ 23 февраля 2018

По крайней мере, в React это может быть

this.default.name

0 голосов
/ 11 октября 2010

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

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

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