ホームページ > 記事 > ウェブフロントエンド > Javascript のプロキシとリフレクトについて話しましょう
この記事では、JavaScript のプロキシとリフレクトに関する関連知識を提供します。お役に立てば幸いです。
ECMAScript は、Proxy と Reflect という 2 つの新しい機能を ES6 仕様に追加しました。これら 2 つの新しい機能は、JavaScript でのオブジェクト アクセスの制御性を強化し、JS モジュール、クラスのカプセル化を作成します。より厳密かつシンプルにすることができ、オブジェクトを操作する際のエラー報告もより制御しやすくなります。
プロキシは、その名前が示すように、プロキシです。このインターフェイスは、指定されたオブジェクトのプロキシ オブジェクトを作成できます。プロパティへのアクセス、プロパティへの値の割り当て、関数呼び出しなど、プロキシ オブジェクトに対する操作はすべてインターセプトされ、定義した関数に渡されて、
JavaScript の特性により、オブジェクトに多くの操作の余地が与えられます。同時に、JavaScript はオブジェクトを変換するためのメソッドも多数提供します。属性を自由に追加したり、属性を削除したりすることができます。オブジェクトのプロトタイプを自由に変更できます...しかし、Object クラスによって以前に提供されていた API には多くの欠点があります:
プロキシ インターフェイスの登場により、これらの問題は非常にうまく解決されます。
プロキシ インターフェイスは、JS 環境のコンストラクターです:
ƒ Proxy ( target: Object, handlers: Object ) : Proxy
このコンストラクターには 2 つのパラメーターがあります。最初のパラメーターはプロキシするオブジェクトで、2 番目のパラメーターにはオブジェクトが含まれますさまざまな操作を処理する関数のことです。
以下は呼び出し例です:
//需要代理的目标 var target = { msg: "I wish I was a bird!" }; //包含处理各种操作的函数的对象 var handler = { //处理其中一种操作的函数,此处是访问属性的操作 get(target, property) { //在控制台打印访问了哪个属性 console.log(`你访问了 ${property} 属性`); //实现操作的功能 return target[property]; } } //构造代理对象 var proxy = new Proxy( target , handler); //访问代理对象 proxy.msg //控制台: 你访问了 msg 属性 //← I wish I was a bird!
上記の例では、最初にオブジェクトが作成されてターゲットに割り当てられ、次にターゲットをターゲットとしてプロキシ オブジェクトが作成され、プロキシに割り当てられます。 Proxy コンストラクターに 2 番目のパラメーターとして指定されたオブジェクトには、関数である「get」という名前の属性があります。「get」は、Proxy インターフェイスのトラップの名前です。Proxy は、指定した属性を次のように参照します。 2 番目のパラメータ オブジェクト内の属性について、トラップ名と同じ属性名を持つ属性を検索し、対応するトラップを自動的に設定し、その属性に対する関数をトラップ処理関数として使用します。トラップはプロキシ オブジェクト上の特定の操作をインターセプトし、操作の詳細をパラメーターに変換して処理関数に渡し、処理関数が操作を完了できるようにします。これにより、処理関数を通じてオブジェクトのさまざまな動作を制御できるようになります。
上記の例では、プロキシ オブジェクトの構築時に提供された get 関数は、オブジェクトのプロパティへのアクセス操作を処理する関数です。プロキシ オブジェクトは、オブジェクトのプロパティへのアクセス操作をインターセプトし、 ターゲット オブジェクト # を渡します。 ## と ## を get 関数に #アクセスを要求する属性名 #2 つのパラメータと、関数の戻り値がアクセスの結果として使用されます。 プロキシ トラップには 13 種類があります:
インターセプトされた操作 | 操作の例 | |
---|---|---|
オブジェクト プロパティへのアクセス |
target.property |
or target[property ]
|
割り当てオブジェクトのプロパティ |
ターゲット。 property = value | または target[property] = value
| ##has(target, property)
オブジェクト プロパティが存在するかどうかを確認します ##ターゲットのプロパティ |
#isExtensible(target)Determineオブジェクトが属性を追加できるかどうか
|
|
|
preventExtensions(target) | オブジェクトに新しいプロパティを追加できないようにします
|
|
defineProperty(target, property 、記述子) | #オブジェクトのプロパティを定義します
| Object.defineProperty(ターゲット、プロパティ、記述子)
## deleteProperty(target, property) |
オブジェクトのプロパティを削除します | ##delete target.property | or
または Object.deleteProperty(ターゲット, プロパティ)
|
##getOwnPropertyDescriptor(ターゲット, プロパティ)
独自のプロパティのオブジェクト記述子の取得
Object.getOwnPropertyDescriptor(target, property)
|
|
ownKeys(target)
| オブジェクトのすべての独自プロパティを列挙しますObject.getOwnPropertyNames(target).
| concat(Object.getOwnPropertySymbols(target) )|
| getPrototypeOf(target)オブジェクトのプロトタイプを取得します
Object.getPrototypeOf (target)
|
|
setPrototypeOf(target)
| オブジェクトのプロトタイプを設定しますObject .setPrototypeOf(target)
|
|
apply(target, thisArg, argumentList) #関数呼び出し |
#target(...arguments) | ortarget.apply(target, thisArg, argumentList)
|
construct(target, argumentList 、newTarget) | コンストラクター呼び出し |
new target(...arguments)
|
以上がJavascript のプロキシとリフレクトについて話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。