Привыкайте писать вместе! Это 9-й день моего участия в «Новом ежедневном плане Nuggets · Апрельское задание по обновлению», нажмите, чтобы просмотреть подробности мероприятия .
В Proxy
и Reflect
объект, get
третий set
параметр метода receiver
, что это сегодня в этой статье receiver
?
receiver
Перевод означает приемник.Давайте MDN
сначала посмотрим, как интерпретировать этот параметр.
прокси получить приемник
Прокси или объект, который наследует прокси
Когда текущее свойство является getter
свойством доступа, обычно receiver
параметр является самим текущим proxy
. Так при каких же обстоятельствах оно receiver
не proxy
само?
Давайте сначала посмотрим на простой Proxy
каштан, следующий каштан мы используем параметры getter
в ловушке .receiver
let obj ={a:1}
let pObj=new Proxy(obj,{
get(target,key,receiver){
console.log("receiver",receiver); // receiver Proxy {a:1}
console.log("receiver===pObj",receiver===pObj); // true
return Reflect.get(target,key)
}
})
console.log(pObj.a); // 1
复制代码
Из этого каштана можно сделать вывод, что текущий receiver
параметр является текущим прокси-объектом.
Давайте посмотрим на другой Proxy
каштан, когда объект передается по наследству.
let obj ={a:1}
var pObj=new Proxy(obj,{
get(target,key,receiver){
return receiver
}
})
console.log(pObj.getReceiver); // pObj {a: 1}
let child = Object.create(pObj);
console.log(child.getReceiver); // child {}
复制代码
Когда child
объект наследуется от pObj
объекта, receiver
параметр автоматически указывает на объект, который его наследует.
На данный момент у нас есть параметры в Proxy
этом receiver
, а затем давайте посмотрим Reflect
на receiver
параметры в .
Возьмем первый каштан выше и модифицируем его, а Reflect.get
первый параметр изменим на receiver
, то есть при getter
срабатывании receiver
функции получим от него соответствующее значение атрибута.
let obj ={a:1}
let pObj=new Proxy(obj,{
get(target,key,receiver){
return Reflect.get(receiver,key)
}
})
console.log(pObj.a);
复制代码
Uncaught RangeError: превышен максимальный размер стека вызовов
Внимательные студенты обнаружат, что этот фрагмент кода представляет собой бесконечный цикл.При передаче атрибут pObj.a
срабатывает , а затем он продолжает обращаться к середине .... Он был вложен, что привело к бесконечному циклу.getter
receiver
getter
На данный момент Reflect.get
третий параметр Proxy
— это переданный параметр receiver
, давайте исправим приведенный выше код.
let obj ={a:1}
let pObj=new Proxy(obj,{
get(target,key,receiver){
return Reflect.get(target,key,receiver)
}
})
console.log(pObj.a); // 1
复制代码
Reflect.get
Параметр здесь — это значение receiver
при вызове target
объекта , так что может быть не очень понятно, давайте посмотрим на него сквозь каштан.getter
this
const obj = { get a() { return this.b; } };
const proxy = new Proxy(obj, {
get(target, key) {
return target[key]
}
})
console.log(Reflect.get(obj, "a")); // undefined
console.log(Reflect.get(obj, "a", { b: 2 })); // 2
复制代码
В этом каштане мы устанавливаем getter
свойство объекта obj.Когда a
мы обращаемся к a, мы возвращаем b в текущем this.Здесь мы видим, что b не определен, а прямой доступ undefined
, мы используем Reflect
третий параметр для receiver
привязки this
значение { b: 2 }
a может быть доступно в конечном итоге 2
.