Атрибут Class
Атрибут class
объекта – это строка, содержащая информацию о типе объекта. Ни в ECMAScript 3, ни в ECMAScript 5 не предусматривается возможность изменения этого атрибута и предоставляются лишь косвенные способы определения его значения. По умолчанию метод toString()
(наследуемый от Object.prototype
) возвращает строку вида:
[object class]
Поэтому, чтобы определить класс объекта, можно попробовать вызвать метод toString()
этого объекта и извлечь из результата подстроку с восьмого по предпоследний символ. Вся хитрость состоит в том, что многие методы наследуют другие, более полезные реализации метода toString()
, и чтобы вызвать нужную версию toString()
, необходимо выполнить косвенный вызов с помощью метода Function.call()
. В примере ниже определяется функция, возвращающая класс любого объекта, переданного ей:
// Функция classof()
function classof(o) {
if (o === null) return "Null";
if (o === undefined) return "Undefined";
return Object.prototype.toString.call(o).slice(8,-1);
}
Этой функции classof()
можно передать любое значение, допустимое в языке JavaScript. Числа, строки и логические значения действуют подобно объектам, когда относительно них вызывается метод toString()
, а значения null
и undefined
обрабатываются особо. Объекты, созданные с помощью встроенных конструкторов, таких как Array
и Date
, имеют атрибут class
, значение которого совпадает с именами их конструкторов. Объекты среды выполнения обычно также получают осмысленное значение атрибута class
, однако это зависит от реализации. Объекты, созданные с помощью литералов или вызовом Object.create
, получают атрибут class
со значением «Object». Если вы определите свой конструктор, все объекты, созданные с его помощью, получат атрибут class со значением «Object»: нет никакого способа установить иное значение в атрибуте class
для собственных классов объектов:
classof(null) // => "Null"
classof(1) // => "Number"
classof("") // => "String"
classof(false) // => "Boolean"
classof({}) // => "Object"
classof([]) // => "Array"
classof(/./) // => "Regexp"
classof(new Date()) // => "Date"
classof(window) // => "Window" (объект клиентской среды выполнения)
function f() {}; // Определение собственного конструктора
classof(new f()); // => "Object"