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

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

Жанры

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

6.8.1. Атрибут prototype

Атрибут

prototype
объекта определяет объект, от которого наследуются свойства. (Дополнительные сведения о прототипах и наследовании прототипов приводятся в разделах 6.1.3 и 6.2.2.) Этот атрибут играет настолько важную роль, что обычно мы будем говорить о нем как о «прототипе объекта о», а не как об «атрибуте
prototype
объекта о». Кроме того, важно понимать, что когда в программном коде встречается ссылка
prototype
, она обозначает обычное свойство объекта, а не атрибут
prototype
.

Атрибут

prototype
устанавливается в момент создания объекта. В разделе 6.1.3 уже говорилось, что для объектов, созданных с помощью литералов, прототипом является
Object.prototype
. Прототипом объекта, созданного с помощью оператора
new
, является значение свойства
prototype
конструктора. А прототипом объекта, созданного с помощью
Object.сreate,
становится первый аргумент этой функции (который может иметь значение
null
).

Стандартом ECMAScript 5 предусматривается возможность определить прототип любого объекта, если передать его методу

Object.getPrototypeOf.
В ECMAScript 3 отсутствует эквивалентная функция, но зачастую определить прототип объекта о можно с помощью выражения
о.constructor.prototype
. Объекты, созданные с помощью оператора
new
, обычно наследуют свойство
constructor
, ссылающееся на функцию-конструктор, использованную для создания объекта. И как уже говорилось выше, функции-конструкторы имеют свойство
prototype
, которое определяет прототип объектов, созданных с помощью этого конструктора. Подробнее об этом рассказывается в разделе 9.2, где также объясняется, почему этот метод определения прототипа объекта не является достаточно надежным. Обратите внимание, что объекты, созданные с помощью литералов объектов или
Object.сгеate,
получают свойство
constructor
, ссылающееся на конструктор
Object.
Таким образом,
constructor.prototype
ссылается на истинный прототип для литералов объектов, но обычно это не так для объектов, созданных вызовом
Object.create.

Чтобы определить, является ли один объект прототипом (или звеном в цепочке прототипов) другого объекта, следует использовать метод

isPrototypeOf.
Чтобы узнать, является ли
р
прототипом
о
, нужно записать выражение
р.isPrototypeOf(о)
. Например:

var р = {х:1}; // Определить объект-прототип.

var о = Object.сreate(p); // Создать объект с этим прототипом.

р.isPrototypeOf(o) // => true: о наследует р

Object.prototype.isPrototypeOf(р) // => true: р наследует Object.prototype

Обратите внимание, что

isPrototypeOf
по своему действию напоминает оператор
instanceof
(раздел 4.9.4).

В реализации JavaScript компании Mozilla (первоначально созданной в Netscape) значение атрибута

prototype
доступно через специальное свойство
__proto__
, которое можно использовать напрямую для определения и установки прототипа любого объекта. Использование свойства
__proto__
ухудшает переносимость: оно отсутствует (и, вероятно, никогда не появится) в реализациях броузеров IE или Opera, хотя в настоящее время оно поддерживается броузерами Safari и Chrome. Версии Firefox, реализующие стандарт ECMAScript 5, все еще поддерживают свойство
__proto__
, но не позволяют изменять прототип нерасширяемых объектов.

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"

6.8.3. Атрибут extensible

Атрибут

extensible
объекта определяет, допускается ли добавлять в объект новые свойства. В ECMAScript 3 все встроенные и определяемые пользователем объекты неявно допускали возможность расширения, а расширяемость объектов среды выполнения определялась каждой конкретной реализацией. В ECMAScript 5 все встроенные и определяемые пользователем объекты являются расширяемыми, если они не были преобразованы в нерасширяемые объекты, а расширяемость объектов среды выполнения по-прежнему определяется каждой конкретной реализацией.

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

Локки 10. Потомок бога

Решетов Евгений Валерьевич
10. Локки
Фантастика:
фэнтези
юмористическое фэнтези
героическая фантастика
боевая фантастика
5.00
рейтинг книги
Локки 10. Потомок бога

Геном хищника. Книга шестая

Гарцевич Евгений Александрович
6. Я - Легенда!
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Геном хищника. Книга шестая

По прозвищу Святой. Книга первая

Евтушенко Алексей Анатольевич
1. Святой
Фантастика:
попаданцы
альтернативная история
6.40
рейтинг книги
По прозвищу Святой. Книга первая

Инженер Петра Великого 2

Гросов Виктор
2. Инженер Петра Великого
Фантастика:
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Инженер Петра Великого 2

Лекарь Империи 6

Карелин Сергей Витальевич
6. Лекарь Империи
Фантастика:
городское фэнтези
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Лекарь Империи 6

Эволюционер из трущоб. Том 9

Панарин Антон
9. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 9

Маленькая женщина Большого

Зайцева Мария
5. Наша
Любовные романы:
эро литература
современные любовные романы
5.00
рейтинг книги
Маленькая женщина Большого

Последний Паладин. Том 2

Саваровский Роман
2. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 2

Эволюционер из трущоб. Том 3

Панарин Антон
3. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
6.00
рейтинг книги
Эволюционер из трущоб. Том 3

Чужак из ниоткуда

Евтушенко Алексей Анатольевич
1. Чужак из ниоткуда
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чужак из ниоткуда

Бастард Императора. Том 15

Орлов Андрей Юрьевич
15. Бастард Императора
Фантастика:
городское фэнтези
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Бастард Императора. Том 15

Полет аистов

Гранже Жан-Кристоф
Детективы:
триллеры
8.88
рейтинг книги
Полет аистов

Ваше Сиятельство 7

Моури Эрли
7. Ваше Сиятельство
Фантастика:
боевая фантастика
аниме
5.00
рейтинг книги
Ваше Сиятельство 7

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

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 6