Javascript のプロキシとリフレクトについて話しましょう
この記事では、JavaScript のプロキシとリフレクトに関する関連知識を提供します。お役に立てば幸いです。
ECMAScript は、Proxy と Reflect という 2 つの新しい機能を ES6 仕様に追加しました。これら 2 つの新しい機能は、JavaScript でのオブジェクト アクセスの制御性を強化し、JS モジュール、クラスのカプセル化を作成します。より厳密かつシンプルにすることができ、オブジェクトを操作する際のエラー報告もより制御しやすくなります。
プロキシ
プロキシは、その名前が示すように、プロキシです。このインターフェイスは、指定されたオブジェクトのプロキシ オブジェクトを作成できます。プロパティへのアクセス、プロパティへの値の割り当て、関数呼び出しなど、プロキシ オブジェクトに対する操作はすべてインターセプトされ、定義した関数に渡されて、
JavaScript の特性により、オブジェクトに多くの操作の余地が与えられます。同時に、JavaScript はオブジェクトを変換するためのメソッドも多数提供します。属性を自由に追加したり、属性を削除したりすることができます。オブジェクトのプロトタイプを自由に変更できます...しかし、Object クラスによって以前に提供されていた API には多くの欠点があります:
- Object.defineProperty を使用して特定の名前のコレクション内のすべてのプロパティを定義したい場合、列挙を通じてすべてのプロパティに対してゲッターとセッターを設定することしかできません。また、ゲッターとセッターを設定できるのは各プロパティに対してのみであるため、大きすぎるコレクションを含む関数を作成すると、パフォーマンスの問題が発生する可能性があります。
- Object.defineProperty プロパティを定義した後、通常のアクセス機能が必要な場合は、オブジェクトの別のプロパティ名にデータを保存するか、データを保存する別のオブジェクトが必要になるだけです。監視したいプロパティは特に不便です。
- Object.defineProperty は、配列の長さプロパティなど、クラス内の再定義不可能なプロパティを変更できません。
- まだ存在しないプロパティや名前の予測が難しいプロパティの場合、Object.defineProperty は役に立ちません。
- プロパティ名の列挙やオブジェクト プロトタイプの変更など、特定の動作は変更または防止できません。
プロキシ インターフェイスの登場により、これらの問題は非常にうまく解決されます。
- プロキシ インターフェイスは、オブジェクトに対するすべての操作をいくつかのカテゴリに分類し、プロキシ トラップを通じてそれらを提供します。特定の操作をインターセプトし、定義した処理関数で論理的な判断を実行して、複雑な機能を実装し、以前よりも多くの動作を制御します。
- プロキシによって作成されたプロキシ オブジェクトは仲介者の形式で存在し、データを保存する責任はありません。外部ユーザーが制御下にある元のオブジェクトにアクセスできるように、プロキシ オブジェクトを外部ユーザーに提供するだけで済みます。プロキシ オブジェクトのそれです。
プロキシ インターフェイスは、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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









HTML の表の境界線に関するガイド。ここでは、HTML でのテーブルの境界線の例を示しながら、テーブル境界線を定義する複数の方法について説明します。

HTML マージン左のガイド。ここでは、HTML margin-left の概要とその例、およびそのコード実装について説明します。

これは、HTML でのネストされたテーブルのガイドです。ここでは、テーブル内にテーブルを作成する方法をそれぞれの例とともに説明します。

HTML テーブル レイアウトのガイド。ここでは、HTML テーブル レイアウトの値と例および出力について詳しく説明します。

HTML 入力プレースホルダーのガイド。ここでは、コードと出力とともに HTML 入力プレースホルダーの例について説明します。

HTML でのテキストの移動に関するガイド。ここでは、概要、マーキー タグが構文でどのように機能するか、および実装例について説明します。

HTML オンクリック ボタンのガイド。ここでは、それらの紹介、動作、例、およびさまざまなイベントでの onclick イベントについてそれぞれ説明します。
