6.8.2. Атрибут class

Атрибут class объекта - это строка, содержащая информацию о типе объекта. Ни в ECMAScript 3, ни в ECMAScript 5 не предусматривается возможность изменения этого атрибута и предоставляются лишь косвенные способы определения его значения. По умолчанию метод toString() (наследуемый от Object.prototype) возвращает строку вида:

[object class]

Поэтому, чтобы определить класс объекта, можно попробовать вызвать метод toString() этого объекта и извлечь из результата подстроку с восьмого по предпоследний символ. Вся хитрость состоит в том, что многие методы наследуют другие, более полезные реализации метода toString(), и чтобы вызвать нужную версию toString(), необходимо выполнить косвенный вызов с помощью метода Function.саll() (раздел 8.7.3). В примере 6.4 определяется функция, возвращающая класс любого объекта, переданного ей.

Пример 6.4. Функция classoff()

function classof(o) {

  if (о === null) return "Null";

  if (o === undefined) return "Undefined";

  return Object.prototype.toString.call(o).slice(8,-1);

}

Этой функции classof() можно передать любое значение, допустимое в языке JavaScript. Числа, строки и логические значения действуют подобно объектам, когда относительно них вызывается метод toString(), а значения null и undefined обрабатываются особо. (В ECMAScript 5 особая обработка не требуется.) Объекты, созданные с помощью встроенных конструкторов, таких как Array и Date, имеют атрибут class, значение которого совпадает с именами их конструкторов. Объекты среды выполнения обычно также получают осмысленное значение атрибута class, однако это зависит от реализации. Объекты, созданные с помощью литералов или вызовом Object.сreate, получают атрибут class со значением «Object». Если вы определите свой конструктор, все объекты, созданные с его помощью, получат атрибут class со значением «Object»: нет никакого способа установить иное значение в атрибуте class для собственных классов объектов:

classof(null)      // => "Null"

classof(1)         // => "Number"

classof("")        // => "String"

classof(false)     // => "Boolean"

classof({})        // => "Object"

classof([])        // => "Array"

classof(/./)       // => "Regexp"

classof(new DateO) // => "Date"

classof(window)    // => "Window" (объект клиентской среды выполнения)

function f() {};   // Определение собственного конструктора

classof(new f());  // => "Object"