13

Как получить имя типа объекта в Python?

23

Существует ли JavaScript аналог метода class.getName() из Java? ВJava этот метод позволяет получить имя класса в виде строки. Как получить подобную информацию о классе или функции в JavaScript?

5 ответ(ов)

1

Ответ Джейсона Бунтинга дал мне достаточно подсказок, чтобы найти то, что мне нужно:

<<Object instance>>.constructor.name

Например, в следующем фрагменте кода:

function MyObject() {}
var myInstance = new MyObject();

myInstance.constructor.name вернет строку "MyObject".

0

Вот небольшой трюк, который я использую:

function Square() {
    this.className = "Square";
    this.corners = 4;
}

var MySquare = new Square();
console.log(MySquare.className); // "Square"

В этом примере мы создаем конструктор Square, который инициализирует два свойства: className и corners. После этого мы создаем новый экземпляр этого конструктора, используя new Square(), и присваиваем его переменной MySquare. Затем, при выводе MySquare.className, мы можем видеть, что оно равно "Square". Это демонстрирует, как можно использовать функцию-конструктор для создания объектов с определенными свойствами.

0

Вы можете использовать somevar.constructor.name для определения типа переменной следующим образом:

const getVariableType = a => a.constructor.name.toLowerCase();

const d = new Date();
const res1 = getVariableType(d); // 'date'
const num = 5;
const res2 = getVariableType(num); // 'number'
const fn = () => {};
const res3 = getVariableType(fn); // 'function'

console.log(res1); // 'date'
console.log(res2); // 'number'
console.log(res3); // 'function'

В этом примере функция getVariableType возвращает строку с названием класса объекта в нижнем регистре. Таким образом, для объектов Date, Number и Function, вы получите соответственно 'date', 'number' и 'function'. Обратите внимание, что данный метод подойдет для большинства встроенных объектов, но может не сработать для объектов, созданных с помощью Object.create() или для объектов, у которых свойство constructor было переопределено.

0

Использование Object.prototype.toString

Как показывают приведенные примеры, метод Object.prototype.toString - это низкоуровневая и универсальная реализация toString, которая позволяет получить тип всех встроенных типов в JavaScript.

Вот несколько примеров использования:

Object.prototype.toString.call('abc') // [object String]
Object.prototype.toString.call(/abc/) // [object RegExp]
Object.prototype.toString.call([1,2,3]) // [object Array]

Можно написать небольшую вспомогательную функцию для упрощения работы с Object.prototype.toString:

function type(obj){
    return Object.prototype.toString.call(obj).match(/\s\w+/)[0].trim();
}

Эта функция будет возвращать тип объекта в соответствующем формате:

console.log(type('abc')); // [object String]
console.log(type(123));   // [object Number]
console.log(type({}));    // [object Object]
console.log(type(undefined)); // [object Undefined]
console.log(type(function(){})); // [object Function]

Таким образом, используя Object.prototype.toString, вы сможете легко и быстро определять типы различных объектов в JavaScript.

0

В этой статье предлагаю решение, которое устраняет недостатки оператора instanceof в JavaScript. Оно позволяет проверять типы объектов между разными окнами и фреймами, не имея проблем с примитивными типами.

function getType(o) {
    return Object.prototype.toString.call(o).match(/^\[object\s(.*)\]$/)[1];
}
function isInstance(obj, type) {
    var ret = false,
    isTypeAString = getType(type) == "String",
    functionConstructor, i, l, typeArray, context;
    if (!isTypeAString && getType(type) != "Function") {
        throw new TypeError("type argument must be a string or function");
    }
    if (obj !== undefined && obj !== null && obj.constructor) {
        // Получаем конструктор функции
        functionConstructor = obj.constructor;
        while (functionConstructor != functionConstructor.constructor) {
            functionConstructor = functionConstructor.constructor;
        }
        // Получаем контекст окна объекта
        context = functionConstructor == Function ? self : functionConstructor("return window")();
        // Получаем конструктор для типа
        if (isTypeAString) {
            // Если тип строка, строим контекст (window.Array или window.some.Type)
            for (typeArray = type.split("."), i = 0, l = typeArray.length; i < l && context; i++) {
                context = context[typeArray[i]];
            }
        } else {
            // Если тип функция, вызываем её, передавая окно объекта
            context = type(context);
        }
        // Проверяем, является ли объект экземпляром конструктора
        if (context) {
            ret = obj instanceof context;
            if (!ret && (type == "Number" || type == "String" || type == "Boolean")) {
                ret = obj.constructor == context
            }
        }
    }
    return ret;
}

Функция isInstance требует два параметра: объект и тип. Основная идея заключается в том, что она проверяет, находится ли объект в том же окне, и если нет, получает окно этого объекта.

Примеры использования:

isInstance([], "Array"); // true
isInstance("some string", "String"); // true
isInstance(new Object(), "Object"); // true

function Animal() {}
function Dog() {}
Dog.prototype = new Animal();

isInstance(new Dog(), "Dog"); // true
isInstance(new Dog(), "Animal"); // true
isInstance(new Dog(), "Object"); // true
isInstance(new Animal(), "Dog"); // false

Аргумент type также может быть функцией обратного вызова, которая возвращает конструктор. Эта функция получает один параметр — окно указанного объекта.

Примеры:

// Проверка типа "Arguments"
var args = (function() {
    return arguments;
}());

isInstance(args, function(w) {
    return w.Function("return arguments.constructor")();
}); // true

// Проверка типа "NodeList"
var nl = document.getElementsByTagName("*");

isInstance(nl, function(w) {
    return w.document.getElementsByTagName("bs").constructor;
}); // true

Важно помнить, что IE < 9 не предоставляет конструктор для всех объектов, поэтому вышеуказанная проверка для NodeList вернет false, так же как и isInstance(alert, "Function").

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь