Книга: JavaScript. Подробное руководство, 6-е издание

6.8.2. Атрибут class

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"

Оглавление книги


Генерация: 0.905. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз