Как найти имя функции конструкторов пространства имен в javascript? - PullRequest
3 голосов
/ 23 августа 2009

Например, сравните эти два:

function Person(name) {
 this.name = name;
}
var john = new Person('John');
console.log(john.constructor);
// outputs: Person(name)

var MyJSLib = {
 Person : function (name) {
   this.name = name;
 }
}
var john2 = new MyJSLib.Person('John');
console.log(john2.constructor);
// outputs: function()

Первая форма полезна для отладки во время выполнения. Вторая форма требует дополнительных шагов, чтобы выяснить, какой у вас объект.

Я знаю, что мог бы написать описательную функцию toString или вызвать метод toSource для конструктора, чтобы получить больше информации, но я хочу самый простой способ.

Есть ли способ сделать это? Предложения?

Ответы [ 3 ]

6 голосов
/ 23 августа 2009

Хорошо, это происходит потому, что вы используете анонимную функцию.

Вы можете указать имена анонимных функций (да, это звучит странно), вы можете:

var MyJSLib = {
 Person : function Person (name) {
   this.name = name;
 }
}
var john2 = new MyJSLib.Person('John');
console.log(john2.constructor);

Анонимные функции могут быть названы, но эти имена видны только внутри самих функций, и поскольку вы используете оператор new, свойство конструктора будет установлено, и вы сможете увидеть имя.

Вы также можете сравнить ссылку на конструктор, используя или не называя имя функции:

console.log(john2.constructor === MyJSLib.Person); // true
3 голосов
/ 23 августа 2009

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

var MyJSLib = {
 Person : function Person(name) {
   this.name = name;
 }
}
0 голосов
/ 23 августа 2009

что вы хотите, это имя владельца в пространстве имен, поэтому.

function getName(namespace, obj) {
  for name in namespace:
    if (namespace[name] == obj) return name;
}
console.log(getNameOf(MyJSLib, john2.constructor));
...