Proxy: ловушки
Чтобы активировать другие его возможности, добавим ловушки.
Для большинства действий с объектами в спецификации JavaScript есть так называемый «внутренний метод», который на самом низком уровне описывает, как его выполнять. Например,
Ловушки как раз перехватывают вызовы этих внутренних методов. Полный список методов, которые можно перехватывать, перечислен в спецификации Proxy, а также в таблице ниже.
Для каждого внутреннего метода в этой таблице указана ловушка, то есть имя метода, который мы можем добавить в параметр
P.S. На картинке отображена таблица со всеми доступными ловушками.
#разное #proxy #ловушки
Proxy
– это особый объект, у него нет собственных свойств. С пустым handler
он просто перенаправляет все операции на target
.Чтобы активировать другие его возможности, добавим ловушки.
Для большинства действий с объектами в спецификации JavaScript есть так называемый «внутренний метод», который на самом низком уровне описывает, как его выполнять. Например,
[[Get]]
– внутренний метод для чтения свойства, [[Set]]
– для записи свойства, и так далее. Эти методы используются только в спецификации, мы не можем обратиться напрямую к ним по имени.Ловушки как раз перехватывают вызовы этих внутренних методов. Полный список методов, которые можно перехватывать, перечислен в спецификации Proxy, а также в таблице ниже.
Для каждого внутреннего метода в этой таблице указана ловушка, то есть имя метода, который мы можем добавить в параметр
handler
при создании new Proxy
, чтобы перехватывать данную операцию.P.S. На картинке отображена таблица со всеми доступными ловушками.
#разное #proxy #ловушки
👍14🔥2
Proxy: Значение по умолчанию с ловушкой «get»
Чаще всего используются ловушки на чтение/запись свойств.
Чтобы перехватить операцию чтения,
Он срабатывает при попытке прочитать свойство объекта, с аргументами:
-
-
-
Давайте применим ловушку
Например, сделаем числовой массив, так чтобы при чтении из него несуществующего элемента возвращался
#разное #proxy #ловушки
Чаще всего используются ловушки на чтение/запись свойств.
Чтобы перехватить операцию чтения,
handler
должен иметь метод get(target, property, receiver)
.Он срабатывает при попытке прочитать свойство объекта, с аргументами:
-
target
– это оригинальный объект, который передавался первым аргументом в конструктор new Proxy
,-
property
– имя свойства,-
receiver
– если свойство объекта является геттером, то receiver
– это объект, который будет использован как this
при его вызове. Обычно это сам объект прокси (или наследующий от него объект). Прямо сейчас нам не понадобится этот аргумент, подробнее разберём его позже.Давайте применим ловушку
get
, чтобы реализовать «значения по умолчанию» для свойств объекта.Например, сделаем числовой массив, так чтобы при чтении из него несуществующего элемента возвращался
0
.#разное #proxy #ловушки
👍11🔥2
Продвинутая реализация каррирования
Выше представлен "продвинутый" вариант функции каррирования.
Когда мы запускаем её, есть две ветви выполнения
1. Вызвать сейчас: если количество переданных аргументов
2. Частичное применение: в противном случае
На картинке выше показано, что произойдёт в случае
#разное #каррирование
Выше представлен "продвинутый" вариант функции каррирования.
Когда мы запускаем её, есть две ветви выполнения
if
:1. Вызвать сейчас: если количество переданных аргументов
args
совпадает с количеством аргументов при объявлении функции (func.length
) или больше, тогда вызов просто переходит к ней.2. Частичное применение: в противном случае
func
не вызывается сразу. Вместо этого, возвращается другая обёртка pass
, которая снова применит curried
, передав предыдущие аргументы вместе с новыми. Затем при новом вызове мы опять получим либо новое частичное применение (если аргументов недостаточно) либо, наконец, результат.На картинке выше показано, что произойдёт в случае
sum(a, b, c)
. У неё три аргумента, так что sum.length = 3
.#разное #каррирование
👍4🔥1
Proxy: Валидация с ловушкой «set»
Допустим, мы хотим сделать массив исключительно для чисел. Если в него добавляется значение иного типа, то это должно приводить к ошибке.
Ловушка
-
-
-
-
-
Ловушка
#разное #proxy #ловушки
Допустим, мы хотим сделать массив исключительно для чисел. Если в него добавляется значение иного типа, то это должно приводить к ошибке.
Ловушка
set
срабатывает, когда происходит запись свойства.-
set(target, property, value, receiver)
:-
target
– это оригинальный объект, который передавался первым аргументом в конструктор new Proxy
,-
property
– имя свойства,-
value
– значение свойства,-
receiver
– аналогично ловушке get
, этот аргумент имеет значение, только если свойство – сеттер.Ловушка
set
должна вернуть true
, если запись прошла успешно, и false
в противном случае (будет сгенерирована ошибка TypeError
).#разное #proxy #ловушки
👍10🔥2❤1
Строки, Intl.Collator
Intl.Collator - конструктор для «сортировщиков», которые представляют собой объекты, позволяющие сравнивать строки с учетом языка.
Общая проблема строк JavaScript – они «не в курсе» языка и особенностей стран, где находится посетитель.
При сравнении сравниваются коды символов, а это неправильно, к примеру, в русском языке оказывается, что
Intl.Collator решает все эти проблемы.
P.S. Результат
#разное #Intl #интернационализация
Intl.Collator - конструктор для «сортировщиков», которые представляют собой объекты, позволяющие сравнивать строки с учетом языка.
Общая проблема строк JavaScript – они «не в курсе» языка и особенностей стран, где находится посетитель.
При сравнении сравниваются коды символов, а это неправильно, к примеру, в русском языке оказывается, что
"ё" > "я"
и "а" > "Я"
, хотя всем известно, что я
– последняя буква алфавита и это она должна быть больше любой другой.Intl.Collator решает все эти проблемы.
P.S. Результат
compare
имеет значение 1
(больше), 0
(равно) или -1
(меньше).#разное #Intl #интернационализация
👍6🔥1
ТОП-2 способа научиться создавать сайты:
✖️Купить дорогой онлайн-курс
✔️ Подписаться на Сайтодел
Это крупнейшее сообщество Web-разработчиков в Telegram! Там делятся лучшими бесплатными материалами и уроками:
📲 Макеты, сниппеты, репозитории и даже цветовые палитры. Здесь собрано всё, что необходимо новичку!
Подписывайтесь и прокачивайте свои навыки: @sitodel 👈
✖️
✔️ Подписаться на Сайтодел
Это крупнейшее сообщество Web-разработчиков в Telegram! Там делятся лучшими бесплатными материалами и уроками:
📲 Макеты, сниппеты, репозитории и даже цветовые палитры. Здесь собрано всё, что необходимо новичку!
Подписывайтесь и прокачивайте свои навыки: @sitodel 👈
👍4🔥1
Даты, Intl.DateTimeFormat
Первый аргумент – такой же, как и в Collator, а в объекте
Все локали обязаны поддерживать следующие наборы настроек:
- weekday, year, month, day, hour, minute, second
- weekday, year, month, day
- year, month, day
- year, month
- month, day
- hour, minute, second
Если указанный формат не поддерживается, то настройка
#разное #Intl #интернационализация
Первый аргумент – такой же, как и в Collator, а в объекте
options
мы можем определить, какие именно части даты показывать (часы, месяц, год…) и в каком формате.Все локали обязаны поддерживать следующие наборы настроек:
- weekday, year, month, day, hour, minute, second
- weekday, year, month, day
- year, month, day
- year, month
- month, day
- hour, minute, second
Если указанный формат не поддерживается, то настройка
formatMatcher
задаёт алгоритм подбора наиболее близкого формата: basic
– по стандартным правилам и best fit
– по умолчанию, на усмотрение окружения (браузера).#разное #Intl #интернационализация
👍5❤1🔥1
Числа, Intl.NumberFormat
Форматтер
P.S. На скрине показаны примеры создания и использования числового форматтера.
#разное #Intl #интернационализация
Форматтер
Intl.NumberFormat
умеет красиво форматировать не только числа, но и валюту, а также проценты.P.S. На скрине показаны примеры создания и использования числового форматтера.
#разное #Intl #интернационализация
👍8🔥4
This media is not supported in your browser
VIEW IN TELEGRAM
Делать сайты не так сложно как кажется!
На нашем втором канале Полезная вЁрстка можно найти готовые решения ежедневных задач, с которыми сталкиваются веб-разработчики.
Подписывайся на канал и получай новые идеи!
На нашем втором канале Полезная вЁрстка можно найти готовые решения ежедневных задач, с которыми сталкиваются веб-разработчики.
Подписывайся на канал и получай новые идеи!
👍3🔥2
Соседи и родитель
Соседи – это узлы, у которых один и тот же родитель.
Следующий сосед – в свойстве
Родитель доступен через
P.S. Примеры показаны на картинке выше.
#браузер #документ #dom_навигация
Соседи – это узлы, у которых один и тот же родитель.
Следующий сосед – в свойстве
nextSibling
, а предыдущий – в previousSibling
.Родитель доступен через
parentNode
.P.S. Примеры показаны на картинке выше.
#браузер #документ #dom_навигация
👍6🔥2
Методы в Date, String, Number
Методы форматирования также поддерживаются в обычных строках, датах, числах:
Сравнивает строку с другой, с учётом локали.
Форматирует дату в соответствии с локалью.
То же, что и выше, но опции по умолчанию включают в себя год, месяц, день.
То же, что и выше, но опции по умолчанию включают в себя часы, минуты, секунды.
Форматирует число, используя опции
Все эти методы при запуске создают соответствующий объект
P.S. Примеры по каждому методу показаны на картинке.
#разное #Intl #интернационализация
Методы форматирования также поддерживаются в обычных строках, датах, числах:
String.prototype.localeCompare(that [, locales [, options]])
Сравнивает строку с другой, с учётом локали.
Date.prototype.toLocaleString([locales [, options]])
Форматирует дату в соответствии с локалью.
Date.prototype.toLocaleDateString([locales [, options]])
То же, что и выше, но опции по умолчанию включают в себя год, месяц, день.
Date.prototype.toLocaleTimeString([locales [, options]])
То же, что и выше, но опции по умолчанию включают в себя часы, минуты, секунды.
Number.prototype.toLocaleString([locales [, options]])
Форматирует число, используя опции
Intl.NumberFormat
.Все эти методы при запуске создают соответствующий объект
Intl.*
и передают ему опции, можно рассматривать их как укороченные варианты вызова.P.S. Примеры по каждому методу показаны на картинке.
#разное #Intl #интернационализация
🔥6👍2
Браузерное окружение, спецификации
Язык JavaScript изначально был создан для веб-браузеров. Но с тех пор он значительно эволюционировал и превратился в кроссплатформенный язык программирования для решения широкого круга задач.
Сегодня JavaScript может использоваться в браузере, на веб-сервере или в какой-то другой среде, даже в кофеварке. Каждая среда предоставляет свою функциональность, которую спецификация JavaScript называет окружением.
Окружение предоставляет свои объекты и дополнительные функции, в дополнение базовым языковым. Браузеры, например, дают средства для управления веб-страницами. Node.js делает доступными какие-то серверные возможности и так далее.
P.S. На картинке в общих чертах показано, что доступно для JavaScript в браузерном окружении.
#браузер #документ
Язык JavaScript изначально был создан для веб-браузеров. Но с тех пор он значительно эволюционировал и превратился в кроссплатформенный язык программирования для решения широкого круга задач.
Сегодня JavaScript может использоваться в браузере, на веб-сервере или в какой-то другой среде, даже в кофеварке. Каждая среда предоставляет свою функциональность, которую спецификация JavaScript называет окружением.
Окружение предоставляет свои объекты и дополнительные функции, в дополнение базовым языковым. Браузеры, например, дают средства для управления веб-страницами. Node.js делает доступными какие-то серверные возможности и так далее.
P.S. На картинке в общих чертах показано, что доступно для JavaScript в браузерном окружении.
#браузер #документ
👍9🔥1
DOM (Document Object Model)
Document Object Model, сокращённо DOM – объектная модель документа, которая представляет все содержимое страницы в виде объектов, которые можно менять.
Объект
Мы использовали в примере только
DOM Living Standard на https://dom.spec.whatwg.org
#браузер #документ
Document Object Model, сокращённо DOM – объектная модель документа, которая представляет все содержимое страницы в виде объектов, которые можно менять.
Объект
document
– основная «входная точка». С его помощью мы можем что-то создавать или менять на странице.Мы использовали в примере только
document.body.style
, но на самом деле возможности по управлению страницей намного шире. Различные свойства и методы описаны в спецификации:DOM Living Standard на https://dom.spec.whatwg.org
#браузер #документ
👍5🔥2
BOM (Browser Object Model)
Объектная модель браузера (Browser Object Model, BOM) – это дополнительные объекты, предоставляемые браузером (окружением), чтобы работать со всем, кроме документа.
Например:
- Объект navigator даёт информацию о самом браузере и операционной системе. Среди множества его свойств самыми известными являются:
- Объект location позволяет получить текущий URL и перенаправить браузер по новому адресу.
Пример как мы можем использовать объект
Функции
#браузер #документ
Объектная модель браузера (Browser Object Model, BOM) – это дополнительные объекты, предоставляемые браузером (окружением), чтобы работать со всем, кроме документа.
Например:
- Объект navigator даёт информацию о самом браузере и операционной системе. Среди множества его свойств самыми известными являются:
navigator.userAgent
– информация о текущем браузере, и navigator.platform
– информация о платформе (может помочь в понимании того, в какой ОС открыт браузер – Windows/Linux/Mac и так далее).- Объект location позволяет получить текущий URL и перенаправить браузер по новому адресу.
Пример как мы можем использовать объект
location
показан на рисунке.Функции
alert/confirm/prompt
тоже являются частью BOM: они не относятся непосредственно к странице, но представляют собой методы объекта окна браузера для коммуникации с пользователем.#браузер #документ
👍7🔥3
Пример DOM
DOM – это представление HTML-документа в виде дерева тегов.
На картинке слева отображён пример простого HTML-документа, а справа DOM дерево тегов.
Каждый узел этого дерева – это объект.
Теги являются узлами-элементами (или просто элементами). Они образуют структуру дерева:
Текст внутри элементов образует текстовые узлы, обозначенные как
Например, в теге
Обратите внимание на специальные символы в текстовых узлах:
- перевод строки:
- пробел:
#браузер #документ #dom
DOM – это представление HTML-документа в виде дерева тегов.
На картинке слева отображён пример простого HTML-документа, а справа DOM дерево тегов.
Каждый узел этого дерева – это объект.
Теги являются узлами-элементами (или просто элементами). Они образуют структуру дерева:
<html>
– это корневой узел, <head>
и <body>
его дочерние узлы и т.д.Текст внутри элементов образует текстовые узлы, обозначенные как
#text
. Текстовый узел содержит в себе только строку текста. У него не может быть потомков, т.е. он находится всегда на самом нижнем уровне.Например, в теге
<title>
есть текстовый узел "О лосях"
.Обратите внимание на специальные символы в текстовых узлах:
- перевод строки:
↵
(в JavaScript он обозначается как \n
)- пробел:
␣
#браузер #документ #dom
👍8❤2
Автоисправление
Если браузер сталкивается с некорректно написанным HTML-кодом, он автоматически корректирует его при построении DOM.
Например, в начале документа всегда должен быть тег
Например, если HTML-файл состоит из единственного слова
При генерации DOM браузер самостоятельно обрабатывает ошибки в документе, закрывает теги и так далее.
В примере единственный тег
#браузер #документ #dom
Если браузер сталкивается с некорректно написанным HTML-кодом, он автоматически корректирует его при построении DOM.
Например, в начале документа всегда должен быть тег
<html>
. Даже если его нет в документе – он будет в дереве DOM, браузер его создаст. То же самое касается и тега <body>
.Например, если HTML-файл состоит из единственного слова
"Привет"
, браузер обернёт его в теги <html>
и <body>
, добавит необходимый тег <head>
.При генерации DOM браузер самостоятельно обрабатывает ошибки в документе, закрывает теги и так далее.
В примере единственный тег
<p>
не закрыт, однако DOM будет нормальным, потому что браузер сам закроет тег и восстановит отсутствующие детали.#браузер #документ #dom
👍8🔥1
Привет, дорогой подписчик!
Хотел бы ты видеть на канале заметки и обучающие материалы по HTML, CSS и Frontend-разработке в целом?
Хотел бы ты видеть на канале заметки и обучающие материалы по HTML, CSS и Frontend-разработке в целом?
Anonymous Poll
86%
Да
8%
Нет
6%
Без разницы
🔥11👍2
Другие типы узлов
Есть и некоторые другие типы узлов, кроме элементов и текстовых узлов.
Например, узел-комментарий, который вы можете увидеть на картинке выше.
Здесь мы видим узел нового типа – комментарий, обозначенный как
Казалось бы – зачем комментарий в DOM? Он никак не влияет на визуальное отображение. Но есть важное правило: если что-то есть в HTML, то оно должно быть в DOM-дереве.
Все, что есть в HTML, даже комментарии, является частью DOM.
Даже директива
Даже объект
Существует 12 типов узлов. Но на практике мы в основном работаем с 4 из них:
#браузер #документ #dom
Есть и некоторые другие типы узлов, кроме элементов и текстовых узлов.
Например, узел-комментарий, который вы можете увидеть на картинке выше.
Здесь мы видим узел нового типа – комментарий, обозначенный как
#comment
, между двумя текстовыми узлами.Казалось бы – зачем комментарий в DOM? Он никак не влияет на визуальное отображение. Но есть важное правило: если что-то есть в HTML, то оно должно быть в DOM-дереве.
Все, что есть в HTML, даже комментарии, является частью DOM.
Даже директива
<!DOCTYPE...>
, которую мы ставим в начале HTML, тоже является DOM-узлом. Она находится в дереве DOM прямо перед <html>
. Мы не будем рассматривать этот узел, мы даже не рисуем его на наших диаграммах, но он существует.Даже объект
document
, представляющий весь документ, формально является DOM-узлом.Существует 12 типов узлов. Но на практике мы в основном работаем с 4 из них:
document
, узлы-элементы, текстовые узлы, комментарии.#браузер #документ #dom
👍5🔥1
Поэкспериментируйте сами
Чтобы посмотреть структуру DOM в реальном времени, попробуйте Live DOM Viewer. Просто введите что-нибудь в поле, и ниже вы увидите, как меняется DOM.
Другой способ исследовать DOM – это использовать инструменты разработчика браузера. Это то, что мы каждый день делаем при разработке.
Для этого откройте страницу elks.html, включите инструменты разработчика и перейдите на вкладку Elements.
Выглядит примерно так, как на картинке выше.
Вы можете увидеть DOM, понажимать на элементы, детально рассмотреть их и так далее.
Обратите внимание, что структура DOM в инструментах разработчика отображается в упрощённом виде. Текстовые узлы показаны как простой текст. И кроме пробелов нет никаких «пустых» текстовых узлов. Ну и отлично, потому что большую часть времени нас будут интересовать узлы-элементы.
#браузер #документ #dom
Чтобы посмотреть структуру DOM в реальном времени, попробуйте Live DOM Viewer. Просто введите что-нибудь в поле, и ниже вы увидите, как меняется DOM.
Другой способ исследовать DOM – это использовать инструменты разработчика браузера. Это то, что мы каждый день делаем при разработке.
Для этого откройте страницу elks.html, включите инструменты разработчика и перейдите на вкладку Elements.
Выглядит примерно так, как на картинке выше.
Вы можете увидеть DOM, понажимать на элементы, детально рассмотреть их и так далее.
Обратите внимание, что структура DOM в инструментах разработчика отображается в упрощённом виде. Текстовые узлы показаны как простой текст. И кроме пробелов нет никаких «пустых» текстовых узлов. Ну и отлично, потому что большую часть времени нас будут интересовать узлы-элементы.
#браузер #документ #dom
👍8🔥2
Создание элемента
DOM-узел можно создать двумя методами:
Большую часть времени нам нужно создавать узлы элементов, такие как
#браузер #документ #изменение
DOM-узел можно создать двумя методами:
document.createElement(tag)
- создаёт новый элемент с заданным тегом.document.createTextNode(text)
- создаёт новый текстовый узел с заданным текстом.Большую часть времени нам нужно создавать узлы элементов, такие как
div
для сообщения.#браузер #документ #изменение
👍10🔥3