¡Acostúmbrate a escribir juntos! Este es el noveno día de mi participación en el "Nuggets Daily New Plan · April Update Challenge", haz clic para ver los detalles del evento .
En Proxy
y Reflect
objeto, get
el set
tercer parámetro del método es receiver
, ¿qué es esto en este artículo de hoy receiver
?
receiver
La traducción significa el receptor.Veamos MDN
primero cómo interpretar este parámetro.
proxy obtener receptor
Proxy o un objeto que hereda Proxy
Cuando la propiedad actual es una getter
propiedad de acceso, normalmente el receiver
parámetro es el proxy
propio actual. Entonces, ¿bajo qué circunstancias no es ella receiver
misma proxy
?
Primero veamos una Proxy
castaña simple, la siguiente castaña usamos los parámetros getter
en el catcher .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
复制代码
A partir de este castaño, se puede concluir que el receiver
parámetro actual es el objeto proxy actual.
Miremos otra Proxy
castaña cuando se hereda el objeto .
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 {}
复制代码
Cuando un child
objeto se hereda de otro pObj
objeto, el receiver
parámetro apuntará automáticamente al objeto que lo hereda.
En este punto, tenemos cuáles son Proxy
los receiver
parámetros en this, y luego veamos Reflect
los receiver
parámetros en .
Tomemos la primera castaña de arriba y modifíquela, y cambiemos Reflect.get
el primer parámetro a receiver
, es decir, cuando getter
se active la función receiver
, obtenga el valor de atributo correspondiente de ella.
let obj ={a:1}
let pObj=new Proxy(obj,{
get(target,key,receiver){
return Reflect.get(receiver,key)
}
})
console.log(pObj.a);
复制代码
RangeError no capturado: se excedió el tamaño máximo de la pila de llamadas
Los estudiantes cuidadosos encontrarán que este fragmento de código es un bucle infinito. Al pasar , el atributo pObj.a
se activa y luego continúa accediendo al medio ... Se ha anidado, lo que da como resultado un bucle infinito.getter
receiver
getter
En este momento Reflect.get
, el tercer parámetro Proxy
es el parámetro pasado receiver
, corrijamos el código anterior.
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
El receiver
parámetro aquí es el valor cuando se llama al target
objeto , por lo que puede no ser muy claro, echemos un vistazo a través de una castaña.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
复制代码
En este castaño, establecemos una getter
propiedad en el objeto obj. a
Cuando accedemos a, devolvemos b en el this actual. Aquí podemos ver que b no está definido, y el acceso directo es undefined
, usamos Reflect
el tercer parámetro para receiver
vincular The eventualmente se puede acceder al this
valor de a .{ b: 2 }
2