Сборка от 17 марта 2017 г


Некоторые другие возможности



Download 9,9 Mb.
bet194/349
Sana26.04.2022
Hajmi9,9 Mb.
#582433
TuriУчебник
1   ...   190   191   192   193   194   195   196   197   ...   349
Bog'liq
ilja kantor sovremennyj uchebnik-1chast PdfToWord

Некоторые другие возможности


Различные возможности JavaScript, которые достаточно важны, но не заслужили отдельного раздела.


Типы данных: [[Class]], instanceof и утки


Время от времени бывает удобно создавать так называемые «полиморфные» функции, то есть такие, которые по‑разному обрабатывают аргументы, в зависимости от их типа. Например, функция вывода может по‑разному форматировать числа и даты.


Для реализации такой возможности нужен способ определить тип переменной.


Оператор typeof


Мы уже знакомы с простейшим способом – оператором typeof.

Оператор typeof надежно работает с примитивными типами, кроме null , а также с функциями. Он возвращает для них тип в виде строки:


alert( typeof 1 ); // 'number' alert( typeof true ); // 'boolean' alert( typeof "Текст" ); // 'string' alert( typeof undefined ); // 'undefined'


alert( typeof null ); // 'object' (ошибка в языке) alert( typeof alert ); // 'function'

…Но все объекты, включая массивы и даты для typeof – на одно лицо, они имеют один тип 'object' :


alert( typeof {} ); // 'object' alert( typeof [] ); // 'object' alert( typeof new Date ); // 'object'


Поэтому различить их при помощи typeof нельзя, и в этом его основной недостаток.




Секретное свойство [[Class]]


Для встроенных объектов есть одна «секретная» возможность узнать их тип, которая связана с методом toString .


Во всех встроенных объектах есть специальное свойство [[Class]] , в котором хранится информация о его типе или конструкторе.


Оно взято в квадратные скобки, так как это свойство – внутреннее. Явно получить его нельзя, но можно прочитать его «в обход», воспользовавшись методом toString стандартного объекта Object .


Его внутренняя реализация выводит [[Class]] в небольшом обрамлении, как "[object значение]" . Например:

var toString = {}.toString;


var arr = [1, 2];


alert( toString.call(arr) ); // [object Array]

var date = new Date;


alert( toString.call(date) ); // [object Date]

var user = { name: "Вася" };


alert( toString.call(user) ); // [object Object]

В первой строке мы взяли метод toString , принадлежащий именно стандартному объекту {} . Нам пришлось это сделать, так как у Date и Array – свои собственные методы toString , которые работают иначе.


Затем мы вызываем этот toString в контексте нужного объекта obj , и он возвращает его внутреннее, невидимое другими способами, свойство
[[Class]] .


Для получения [[Class]] нужна именно внутренняя реализация toString стандартного объекта Object , другая не подойдёт.

К счастью, методы в JavaScript – это всего лишь функции‑свойства объекта, которые можно скопировать в переменную и применить на другом объекте через call/apply . Что мы и делаем для {}.toString .


Метод также можно использовать с примитивами:

alert( {}.toString.call(123) ); // [object Number] alert( {}.toString.call("строка") ); // [object String]



Для большего удобства можно сделать функцию getClass , которая будет возвращать только сам [[Class]] :


function getClass(obj) {


return {}.toString.call(obj).slice(8, ‐1);
}
alert( getClass(new Date) ); // Date alert( getClass([1, 2, 3]) ); // Array

Заметим, что свойство [[Class]] есть и доступно для чтения указанным способом – у всех встроенных объектов. Но его нет у объектов, которые создают наши функции. Точнее, оно есть, но равно всегда "Object" .


Например:

function User() {} var user = new User();


alert( {}.toString.call(user) ); // [object Object], не [object User]

Поэтому узнать тип таким образом можно только для встроенных объектов.





Download 9,9 Mb.

Do'stlaringiz bilan baham:
1   ...   190   191   192   193   194   195   196   197   ...   349




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish