Как получить имя типа объекта в Python?
Существует ли JavaScript аналог метода class.getName() из Java? ВJava этот метод позволяет получить имя класса в виде строки. Как получить подобную информацию о классе или функции в JavaScript?
5 ответ(ов)
Ответ Джейсона Бунтинга дал мне достаточно подсказок, чтобы найти то, что мне нужно:
<<Object instance>>.constructor.name
Например, в следующем фрагменте кода:
function MyObject() {}
var myInstance = new MyObject();
myInstance.constructor.name
вернет строку "MyObject"
.
Вот небольшой трюк, который я использую:
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"
. Это демонстрирует, как можно использовать функцию-конструктор для создания объектов с определенными свойствами.
Вы можете использовать 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
было переопределено.
Использование 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.
В этой статье предлагаю решение, которое устраняет недостатки оператора 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")
.
Как перенаправить на другую веб-страницу?
Где найти документацию по форматированию даты в JavaScript?
Как определить нажатие клавиши Esc?
Как проверить, содержит ли массив строку в TypeScript?
Ссылка и выполнение внешнего JavaScript-файла, размещенного на GitHub