deleteProperty
Ловушка deleteProperty по синтаксису аналогична get/has .
Срабатывает при операции delete , должна вернуть true , если удаление было успешным.
В примере ниже delete не повлияет на исходный объект, так как все операции перехватываются и «аннигилируются» прокси:
'use strict';
let dictionary = { 'Hello': 'Привет'
};
let proxy = new Proxy(dictionary, { deleteProperty(target, phrase) {
return true; // ничего не делаем, но возвращает true
}
});
// не удалит свойство delete proxy['Hello'];
alert("Hello" in dictionary); // true
// будет то же самое, что и выше
// так как нет ловушки has, операция in сработает на исходном объекте alert("Hello" in proxy); // true
enumerate
Ловушка enumerate перехватывает операции for..in и for..of по объекту.
Как и до ранее, если ловушки нет, то эти операторы работают с исходным объектом:
'use strict';
let obj = {a: 1, b: 1};
let proxy = new Proxy(obj, {});
// перечисление прокси работает с исходным объектом for(let prop in proxy) {
alert(prop); // Выведет свойства obj: a, b
}
Если же ловушка enumerate есть, то она будет вызвана с единственным аргументом target и сможет вернуть итератор для свойств. В примере ниже прокси делает так, что итерация идёт по всем свойствам, кроме начинающихся с подчёркивания _ :
'use strict';
let user = { name: "Ilya",
surname: "Kantor",
_version: 1,
_secret: 123456
};
let proxy = new Proxy(user, { enumerate(target) {
let props = Object.keys(target).filter(function(prop) { return prop[0] != '_';
});
return props[Symbol.iterator]();
}
});
// отфильтрованы свойства, начинающиеся с _ for(let prop in proxy) {
alert(prop); // Выведет свойства user: name, surname
}
Посмотрим внимательнее, что происходит внутри enumerate :
Сначала получаем список интересующих нас свойств в виде массива.
Метод должен возвратить итератор по массиву. Встроенный итератор для массива получаем через вызов props[Symbol.iterator]() .
apply
Прокси умеет работать не только с обычными объектами, но и с функциями.
Если аргумент target прокси – функция, то становится доступна ловушка apply для её вызова. Метод apply(target, thisArgument, argumentsList) получает:
target – исходный объект.
thisArgument – контекст this вызова.
argumentsList – аргументы вызова в виде массива.
Она может обработать вызов сама и/или передать его функции.
'use strict';
function sum(a, b) { return a + b;
}
let proxy = new Proxy(sum, {
// передаст вызов в target, предварительно сообщив о нём apply: function(target, thisArg, argumentsList) {
alert(`Буду вычислять сумму: ${argumentsList}`); return target.apply(thisArg, argumentsList);
}
});
// Выведет сначала сообщение из прокси,
// а затем уже сумму alert( proxy(1, 2) );
Нечто подобное можно сделать через замыкания. Но прокси может гораздо больше. В том числе и перехватывать вызовы через new .
Do'stlaringiz bilan baham: |