Page 344 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 344
Предположим, что свойства этого объекта представляют коэффициенты в мате
матическом уравнении. Мы могли бы использовать его так.
function evaluate ( x , с) {
return с . а + с . Ь * х + с . с * Math . p ow ( x , 2 ) ;
Пока неплохо". Т е перь мы можем хранить коэффициенты квадратного уравнения
в объекте и вычислять уравнение для любого значения х. Но что если мы передадим
объект с недостающими коэффициентами?
const coeff icients = {
а : 1 ,
с : 3 ,
} ;
evaluate ( S , coefficients ) ; / / NaN
t
Мы могли бы решить проблему, установив coefficien s . Ь равным О, но прок
си-объекты предоставляют нам лучшую возможность. Поскольку они способны
перехватывать действия с объектом, мы можем гарантировать, что неопределенные
свойства всегда будут иметь значение О. Давайте создадим прокси-объект для наше
го объекта co f ficients.
e
const betterCoefficients = new Proxy ( c oefficients ,
e
get ( t arg t , key) {
return target [ k ey] 1 1 О ;
} ,
} ) ;
На момент написания этой книги прокси-объекты не поддержива
лись в Babel. Однако они поддерживаются в текущем выпуске Firefox,
и эти примеры кода можно проверить там.
Первый аргумент конструктора Proxy - целевой объект (target), или объект,
к которому применяется прокси-объект. Второй аргумент - обработчик (handler),
который определяет перехватываемые действия. В данном случае мы перехватываем
только доступ к свойствам, обозначаемый функцией get. Этот процесс несколько от
личается от методов доступа к свойствам get . . , поскольку он работает и для обыч
.
ных свойств, и для методов доступа. Функции get передается три аргумента (мы ис
пользуем только первые два): целевой объект, ключ свойства (строка или символ)
и получатель (сам прокси-объект или нечто происходящее от него).
В этом примере мы просто выясняем, установлен ли ключ на целевом объекте,
и если не установлен, то возвращаем значение О. Давайте опробуем это.
betterCoefficien s . a ; 1 1 1
t
betterCoefficient . b ; 1 1 о
s
betterCoefficients . c ; 1 1 3
Прокси-объекты 347

