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

Javascript get type/instance name

Есть ли надежный способ получить экземпляр объекта JavaScript?

Например, полагаясь на фальшивую функцию < obj.getInstance().

var T = {
    Q: {
        W: {
           C: function() {}
        }
    } 
};

var x = new T.Q.W.C();
console.log( x.getInstance() === T.Q.W.C); // should output true

Если это не является частью спецификации ECMA, пожалуйста, включите поддержку браузера / node.js и совместимость в ответах.

4b9b3361

Ответ 1

Чтобы получить указатель на функцию-экземпляр (который не является "классом", но является типом), используйте obj.constructor, где obj - любой объект.


В JavaScript нет классов. Таким образом, в JavaScript нет экземпляров классов. Есть только объекты. Объекты наследуются от других объектов (их так называемые прототипы). То, что вы делаете в своем коде, буквально определяет объект T, атрибут Q - это другой объект, атрибут W которого является другим объектом, атрибутом C которого является функция.

Когда вы создаете новый экземпляр T.Q.W.C, вы на самом деле вызываете только функцию T.Q.W.C в качестве конструктора. Функция, называемая конструктором, вернет новый объект, на который была вызвана функция конструктора (то есть с this, выходящей за новый объект, например constructorFunction.apply(newObject, arguments);). Этот возвращенный объект будет иметь скрытое свойство constructor, которое укажет на функцию, которая была вызвана как constrcutor для создания объекта. Кроме того, существует функция языка, которая позволяет вам проверить, была ли данная функция использована как функция-конструктор для объекта с помощью оператора instanceof.

Итак, вы можете сделать следующее:

console.log(x instanceof T.Q.W.C);

ИЛИ

console.log(x.constructor === T.Q.W.C);

Ответ 2

Проверено только в Chrome:

function FooBar() {

}

var foobar = new FooBar();

console.log(foobar.constructor.name);  // Prints 'FooBar'

Ответ 3

У меня были некоторые проблемы с этим, решение было:

String(x.constructor) === String(T.Q.W.C)

Ответ 4

Если кто-то все еще читает это в 2017 году:

Будьте осторожны с использованием obj.constructor, поскольку это не непреложное свойство.

Оператор instanceof, как правило, более надежный. Вы также можете использовать Object.getPrototypeOf(obj):

var arr = [];
arr instanceof Array; // true
Object.getPrototypeOf(arr); // Array [  ]
Object.getPrototypeOf(arr) === Array.prototype; // true

Смотрите этот полезный документ по теме:

https://github.com/getify/You-Dont-Know-JS/blob/master/this%20%26%20object%20prototypes/ch5.md