2016-08-27 2 views
6

Есть ли существенная разница между Reflect и Proxy?В чем разница между конструктором прокси и Reflect?

Из того, что документировано, кажется, что они имеют довольно много те же возможности, кроме:

  • Reflect способен указать только один ловушку в то время.
  • Прокси - revocable.
  • Прокси - конструктор.

Если приведенный выше список суммирует все различия, то в чем же причина для их использования?

ответ

9

Reflect and Proxy имеет совершенно разные цели и различные возможности.

MDN describes Proxy in that way:

Объект Proxy используется для определения пользовательского поведения для основных операций (например, поиска имущества, присвоения, перечисления, вызов функции, и т.д.).

And Reflect in that way:

Reflect является встроенный объект, который предоставляет методы для interceptable операций JavaScript. Методы те же, что и у proxy handlers.

Я понимаю, что вы, вероятно, уже прочитали это, поэтому я буду использовать пример, чтобы объяснить его дальше.

Допустим, у вас есть объект:

const obj = { 
    a: 'foo', 
    b: 'bar', 
}; 

Вы можете получить доступ к собственности a используя свойство аксессор так:

console.log(obj.a); // 'foo' 

Вы можете сделать то же самое, используя Reflect.get() метод:

console.log(Reflect.get(obj, 'a')); // 'foo' 

Вы также можете создать прокси этого объекта, используя Конструктор прокси. Мы будем использовать обработчик get для перехвата всех поисков свойств.

const proxy = new Proxy(obj, { 
    get(target, property) { 
    return property in target ? target[property] : 'default'; 
    }, 
}); 

Теперь, используя либо свойство аксессор или Reflect.get() получить неопределенные результаты собственности в строке 'default':

console.log(proxy.c); // 'default' 
console.log(Reflect.get(proxy, 'c')); // 'default' 

Proxy и Reflect может отлично работать вместе. Например, вы можете создать прокси-сервер с обработчиком no-op get, используя Reflect:

new Proxy(obj, { 
    get: Reflect.get, 
}); 
Смежные вопросы