set(target, property, value, receiver) Срабатывает при записи свойства в прокси. Аргументы:
target – целевой объект, тот же который был передан первым аргументом в new Proxy .
value – значение свойства.
receiver – объект, к которому было применено присваивание, обычно сам прокси, либо прототипно наследующий от него.
Метод set должен вернуть true , если присвоение успешно обработано и false в случае ошибки (приведёт к генерации TypeError ).
Пример с выводом всех операций чтения и записи:
'use strict'; let user = {};
let proxy = new Proxy(user, { get(target, prop) {
alert(`Чтение ${prop}`); return target[prop];
},
set(target, prop, value) { alert(`Запись ${prop} ${value}`); target[prop] = value;
return true;
}
});
proxy.firstName = "Ilya"; // запись proxy.firstName; // чтение alert(user.firstName); // Ilya
При каждой операции чтения и записи свойств proxy в коде выше срабатывают методы get/set . Через них значение в конечном счёте попадает в объект (или считывается из него).
Можно сделать и позаковыристее.
Методы get/set позволяют реализовать доступ к произвольным свойствам, которых в объекте нет. Например, в коде ниже словарь dictionary содержит различные фразы:
'use strict';
let dictionary = { 'Hello': 'Привет',
'Bye': 'Пока'
};
alert( dictionary['Hello'] ); // Привет
А что, если фразы нет? В этом случае будем возвращать фразу без перевода и, на всякий случай, писать об этом в консоль:
'use strict';
let dictionary = { 'Hello': 'Привет',
'Bye': 'Пока'
};
dictionary = new Proxy(dictionary, { get(target, phrase) {
if (phrase in target) { return target[phrase];
} else {
console.log(`No phrase: ${phrase}`); return phrase;
}
}
})
// Обращаемся к произвольным свойствам словаря! alert( dictionary['Hello'] ); // Привет
alert( dictionary['Welcome']); // Welcome (без перевода)
Аналогично и перехватчик set может организовать работу с произвольными свойствами.
has
Ловушка has срабатывает в операторе in и некоторых других случаях, когда проверяется наличие свойства. В примере выше, если проверить наличие свойства Welcome в dictionary , то оператор in вернёт false :
alert( 'Hello' in dictionary ); // true
alert( 'Welcome' in dictionary ); // false, нет такого свойства
Это потому, что для перехвата in используется ловушка has . При отсутствии ловушки операция производится напрямую над исходным объектом
target , что и даёт такой результат.
Синтаксис has аналогичен get .
Вот так dictionary будет всегда возвращать true для любой in ‑проверки:
'use strict';
let dictionary = { 'Hello': 'Привет'
};
dictionary = new Proxy(dictionary, { has(target, phrase) {
return true;
}
});
alert("BlaBlaBla" in dictionary); // true
Do'stlaringiz bilan baham: |