Prenez l'habitude d'écrire ensemble ! C'est le 9ème jour de ma participation au "Nuggets Daily New Plan · April Update Challenge", cliquez pour voir les détails de l'événement .
Dans Proxy
et Reflect
objet, get
le set
troisième paramètre de la méthode est receiver
, qu'est-ce que c'est dans cet article aujourd'hui receiver
?
receiver
La traduction signifie le récepteur. Voyons d' MDN
abord comment interpréter ce paramètre.
proxy obtenir le récepteur
Proxy ou un objet qui hérite de Proxy
Lorsque la propriété courante est une getter
propriété accesseur, le receiver
paramètre est généralement le courant proxy
lui-même. Alors dans quelles circonstances n'est-il receiver
pas proxy
lui-même ?
Regardons d'abord un Proxy
châtaignier simple, le châtaignier suivant nous utilisons les paramètres getter
dans le receveur .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
复制代码
De ce châtaignier, on peut conclure que le receiver
paramètre courant est l'objet proxy courant.
Regardons un autre Proxy
châtaignier lorsque l'objet est hérité
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 {}
复制代码
Lorsqu'un child
objet est hérité d' un pObj
objet, le receiver
paramètre pointera automatiquement vers l'objet qui en hérite.
À ce stade, nous avons quels sont Proxy
les receiver
paramètres de this, puis regardons Reflect
les receiver
paramètres de .
Prenons la première châtaigne ci-dessus et modifions-la, et changeons Reflect.get
le premier paramètre en receiver
, c'est-à-dire que lorsque la getter
fonction est déclenchée receiver
, récupérons la valeur d'attribut correspondante.
let obj ={a:1}
let pObj=new Proxy(obj,{
get(target,key,receiver){
return Reflect.get(receiver,key)
}
})
console.log(pObj.a);
复制代码
Erreur de plage non détectée : la taille maximale de la pile d'appels a été dépassée
Les étudiants attentifs découvriront que ce morceau de code est une boucle infinie. Lors du passage de , l' attribut pObj.a
est déclenché , puis il continue d'accéder au milieu .... Il a été imbriqué, ce qui donne une boucle infinie.getter
receiver
getter
À ce stade Reflect.get
, le troisième paramètre Proxy
est le paramètre passé dans receiver
, corrigeons le code ci-dessus.
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
Le receiver
paramètre ici est la valeur lorsque l' target
objet est getter
appelé this
, donc ce n'est peut-être pas très clair, regardons-le à travers un châtaignier.
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
复制代码
Dans cette châtaigne, nous définissons une getter
propriété sur l'objet obj. a
Lorsque nous accédons à a, nous renvoyons b dans le courant this. Ici, nous pouvons voir que b n'est pas défini, et l'accès direct est undefined
, nous utilisons Reflect
le troisième paramètre pour receiver
lier The this
la valeur { b: 2 }
de a peut être consultée éventuellement 2
.