Чтение онлайн

на главную - закладки

Жанры

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

9.5.2. Свойство constructor

Другой способ определения класса объекта заключается в использовании свойства constructor. Поскольку конструкторы считаются именами классов, определение класса выполняется очень просто. Например:

function typeAndValue(x) {

if (х == null) return // Значения null и undefined не имеют конструкт.

switch(x.constructor) {

case Number: return "Number: " + x; // Работает с простыми типами

case String: return "String: " + x + ;

case Date: return "Date: ” + x; // Со встроенными типами

case RegExp: return "Regexp: " + x;

case Complex: return "Complex: + x; // И с пользовательскими типами

}

}

Обратите внимание, что выражения в этом примере, следующие за ключевыми словами case, являются функциями. Если бы мы использовали оператор

typeof
или извлекали значение атрибута
class
объекта, они были бы строками.

Для приема, основанного на использовании свойства

constructor
, характерны те же проблемы, что и для приема на основе оператора
instanceof
. Он не всегда будет работать при наличии нескольких контекстов выполнения (например, при наличии нескольких фреймов в окне броузера), совместно использующих общие значения. Каждый фрейм имеет собственный набор функций-конструкторов: конструктор Array в одном фрейме не будет считаться идентичным конструктору Array в другом фрейме.

Кроме того, язык JavaScript не требует, чтобы каждый объект имел свойство

constructor
: это всего лишь соглашение, по которому по умолчанию объект-прототип создается для каждой функции, и очень просто по ошибке или преднамерение опустить свойство
constructor
в прототипе. Например, первые два класса в этой главе (в примерах 9.1 и 9.2) были определены так, что их экземпляры не имеют свойства
constructor
.

9.5.3. Имя конструктора

Основная проблема использования оператора

instanceof
или свойства
constructor
для определения класса объекта проявляется при наличии нескольких контекстов выполнения и, соответственно, при наличии нескольких копий функций-конструкторов. Эти функции могут быть совершенно идентичными, но разными объектами, как следствие, не равными друг другу.

Одно из возможных решений проблемы заключается в том, чтобы использовать в качестве идентификатора класса имя функции-конструктора вместо самой функции. Конструктор

Array
в одном окне не будет равен конструктору
Array
в другом окне, но их имена будут равны. Некоторые реализации JavaScript обеспечивают доступ к имени функции через нестандартное свойство
name
объекта функции. Для реализаций, где свойство
name
отсутствует, можно преобразовать функцию в строку и извлечь имя из нее. (Этот прием использовался в разделе 9.4, где демонстрировалось добавление в класс
Function
метода
getName
.)

В примере 9.4 определяется функция

type,
возвращающая тип объекта в виде строки. Простые значения и функции она обрабатывает с помощью оператора
typeof
. Для объектов она возвращает либо значение атрибута
class
, либо имя конструктора. В своей работе функция
type
использует функцию
classof
из примера 6.4 и метод
Function.getName
из раздела 9.4. Для простоты реализация этой функции и метода включена в пример.

Пример 9.4. Функция type для определения типа значения

/**

* Возвращает тип значения в виде строки:

* -Если о - null, возвращает "null", если о - NaN, возвращает "пап”.

* -Если typeof возвращает значение, отличное от "object", возвращает это значение.

* (Обратите внимание, что некоторые реализации идентифицируют объекты

* регулярных выражений как функции.)

* -Если значение атрибута class объекта о отличается от "Object",

* возвращает это значение.

* -Если о имеет свойство constructor, а конструктор имеет имя, возвращает

* имя конструктора.

* -Иначе просто возвращает "Object".

**/

function type(o) {

var t, c, n; // type, class, name

// Специальный случай для значения null:

if (о === null) return "null":

// Другой специальный случай: NaN - единственное значение, не равное самому себе:

if (о !== о) return "nan";

// Применять typeof для любых значений, отличных от "object".

// Так идентифицируются простые значения и функции,

if ((t = typeof о) !== "object") return t;

// Вернуть класс объекта, если это не "Object".

// Так идентифицируется большинство встроенных объектов,

if ((с = classof(o)) !== "Object") return с;

Поделиться:
Популярные книги

Дама с коготками

Донцова Дарья
3. Любительница частного сыска Даша Васильева
Детективы:
иронические детективы
8.36
рейтинг книги
Дама с коготками

Вернувшийся: Первые шаги. Том II

Vector
2. Вернувшийся
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Вернувшийся: Первые шаги. Том II

Убивать чтобы жить 4

Бор Жорж
4. УЧЖ
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 4

Палач

Зайцев Сергей Григорьевич
4. Викс
Фантастика:
фэнтези
7.27
рейтинг книги
Палач

Эпоха Опустошителя. Том IX

Павлов Вел
9. Вечное Ристалище
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Эпоха Опустошителя. Том IX

Я С СССР! Том III

Вязовский Алексей
3. Я спас СССР
Фантастика:
альтернативная история
5.86
рейтинг книги
Я С СССР! Том III

Кодекс Охотника. Книга II

Винокуров Юрий
2. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
боевая фантастика
юмористическое фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга II

Студент из прошлого тысячелетия

Еслер Андрей
2. Соприкосновение миров
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Студент из прошлого тысячелетия

Наследие Маозари

Панежин Евгений
1. Наследие Маозари
Фантастика:
рпг
попаданцы
аниме
5.80
рейтинг книги
Наследие Маозари

На границе империй. Том 10. Часть 5

INDIGO
23. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 5

Чевенгур

Платонов Андрей Платонович
Проза:
советская классическая проза
6.75
рейтинг книги
Чевенгур

На границе империй. Том 9. Часть 4

INDIGO
17. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 4

Родословная. Том 1

Ткачев Андрей Юрьевич
1. Линия крови
Фантастика:
городское фэнтези
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Родословная. Том 1

Товарищ "Чума" 5

lanpirot
5. Товарищ "Чума"
Фантастика:
городское фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
Товарищ Чума 5