一緒に書く習慣を身につけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して9日目です。クリックしてイベントの詳細をご覧ください。
オブジェクトでProxy
は、メソッドの3番目のパラメーターはです。今日のこの記事ではこれは何ですか?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
、3番目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
复制代码
この栗では、objオブジェクトにgetter
プロパティを設定します。aa
にアクセスすると、現在のthisにbが返されます。ここで、bが定義されておらず、直接アクセスがであることがわかります。3番目のパラメータundefined
を使用してTheをバインドします。 aの値は最終的にアクセスできます。Reflect
receiver
this
{ b: 2 }
2