JavaScript でのプロキシの使用を理解するための記事

JavaScript でのプロキシの使用を理解するための記事

エージェントとは何か

MDN での定義: プロキシ オブジェクトは、基本操作 (プロパティの検索、割り当て、列挙、関数呼び出しなど) のカスタム動作を定義するために使用されます。

公式の定義はいつも非常にわかりにくく退屈ですが、Proxy は具体的に何ができるのでしょうか?

1. エージェントの概念はメタプログラミングに由来します。メタプログラミングは、読み取り、変更、分析、さらには新しいプログラムの生成もできる一種のプログラムです。 JS は、Proxy と Reflect という 2 つのオブジェクトを通じて JS メタプログラミングを実行できます。 !

2. プロキシはプロキシです。オブジェクトへのアクセスが不便な場合や、単純なアクセスでは満足できない場合、プロキシは「仲介者」として機能し、オブジェクトの操作をより適切に制御するのに役立ちます。 !

プロキシの基礎知識

文法:

定数ハンドラ = {};
let target = {}; //ターゲット オブジェクト let userProxy = new Proxy(target,handler); //プロキシが正常に実装されました。 !
ユーザープロキシ.a = 1;
コンソールログ(ターゲットa);//1
console.log(target == userProxy); //false

target : Proxyでラップされるターゲットオブジェクト

ハンドルr: 通常は属性として関数を持つオブジェクトで、各属性の関数はさまざまな操作を実行するときのエージェントの動作を定義します。

わかりました!おめでとうございます。プロキシの定義をマスターしました。

使用時には、ハンドラ内のプロキシ動作のコードにもっと注意を払う必要があります。これにより、プロキシをより適切に使用できるようになります。

ハンドラオブジェクトのメソッド

定数ハンドラ = {
	get(ターゲット、プロパティ、レシーバー){
		console.log('取得!');
		'a' を返します。
	}
}
ターゲットを{name:'tar'}とします。
userProxy = new Proxy(target,handler); とします。
ユーザープロキシ名

もちろん、他にも多くの方法があります。MDNの「ハンドラーオブジェクトのメソッド」を参照してください。

プロキシでできること

プロパティアクセスの追跡

オブジェクトがいつアクセスまたは変更されたかを知る必要がある場合。

 ターゲット = {
	名前:'ww'
	}
 const ハンドラ = {
    get(tar, prop){
     	コンソールログを取得します。
     	Reflect.get(...引数) を返します。 
     },
     set(tar,prop){
		コンソールログに'設定'と入力します。
		Reflect.set(...引数) を返します。
	 }
  }
  userProxy = new Proxy(target, handlers); とします。
  ユーザープロキシ名;
  ユーザープロキシ名 = 'wqw';

オブジェクトのプロパティが未定義である問題を解決する

ターゲットを{}とします
  ハンドラを = {
    取得: (ターゲット、プロパティ) => {
      target[property] = (ターゲット内のプロパティ) ? target[property] : {}
      if (typeof target[property] === 'object') {
        新しいProxy(target[property], handlers)を返す
      }
      ターゲット[プロパティ]を返す
    }
  }
  proxy = new Proxy(ターゲット、ハンドラ) を作成します。
  console.log('z' in proxy.xy) // false (実際、このステップでは `target` の xy 属性が作成されています)
  proxy.xyz = 'こんにちは'
  console.log(proxy.xy の 'z') // true
  console.log(target.xyz) // こんにちは

get をプロキシし、その中で論理処理を実行します。取得したい値が存在しないキーからのものである場合は、target 内に対応するキーを作成し、このキーのプロキシ オブジェクトを返します。

これにより、値取得操作でcan not get xxx from undefinedがスローされなくなります。

ただし、これには小さな欠点があります。つまり、キーが存在するかどうかを実際に判断したい場合、in 演算子を使用してのみ判断でき、get を介して直接判断することはできません。

参考文献:

MDN プロキシ

JS デザインパターン

Proxy ではどんな面白いことができるのでしょうか?

メタプログラミング

要約する

この記事はこれで終わりです。皆さんのお役に立てれば幸いです。また、123WORDPRESS.COM のその他のコンテンツにも注目していただければ幸いです。

以下もご興味があるかもしれません:
  • フロントエンド JavaScript におけるリフレクションとプロキシ
  • JavaScript デザインパターン プロキシパターンの学習
  • JavaScript デザインパターン - プロキシパターンの原則と使用例の分析
  • JavaScriptはイベントリスナーをイベント委任にバッチで追加します。詳細なプロセス
  • JavaScriptイベント実行メカニズムの深い理解
  • js におけるイベントバブリングとイベントキャプチャの簡単な分析
  • JavaScript イベント ループのケース スタディ
  • JavaScript データ プロキシとイベントの詳細な分析

<<:  MySql8.0.19 インストールピットレコードを共有する

>>:  Centos7 環境でソースコードから mysql5.7.16 をインストールする方法の詳細な説明

推薦する

MySQL ロール関数の紹介

目次序文: 1. 役割の紹介2. 役割に関連する操作要約:序文:前回の記事では、MySQLの権限管理...

JS+Canvas が抽選ホイールを引く

この記事では、宝くじターンテーブルを描画するJS + Canvasの具体的なコードを参考までに共有し...

Vueはページdivボックスのドラッグアンドドロップソート機能を実装します

vue は、ページ上の div ボックスのドラッグ アンド ドロップ ソート機能を実装します。 序文...

数千万データを持つMySQLテーブルを最適化する実践記録

序文まずここで説明させてください。インターネット上では、Alibaba では 500 万のデータを異...

CSSアニメーションを使用して背景のシームレスな無限ループを実装する例

1. 需要絵が左から右へ無限ループで動く2. コードモバイルデバイスに適用されているため、rem 単...

MySQL からエクスポートされた scv ファイル内の文字化けやジャンプ行の問題をすばやく解決します

仕事上の理由により、完全なオンライン化(​​つまり、すべてのデータがオンラインで完了し、インポートや...

echarts ワードクラウドチャートを使用した Vue の実践記録

echartsワードクラウドはechartsの拡張版ですhttps://echarts.apache...

シンプルな加算計算機の JavaScript 実装

この記事では、参考までに、加算計算機を実装するためのJavaScriptの具体的なコードを紹介します...

docker を使用して Windows 10 Home バージョンで Laravel 開発環境を構築する方法の詳細なチュートリアル

オペレーティング·システム: Win10 ホームエディションDockerをインストールします:公式サ...

JavaScript の知識: コンストラクタも関数である

目次1. コンストラクタの定義と呼び出し2. 新しいキーワードの目的3. コンストラクタの問題: メ...

Vue の el-table は自動天井効果を実現します (固定をサポート)

目次序文実装のアイデア効果:使用:メインソースコード:序文多くのケースを見た結果、単純な観点からは、...

ウェブページの背景画像を伸ばす2つの方法

解決策は2つあります。 1つはCSSで、background-size:coverを使用して画像の伸...

MySQL 5.7.18 アーカイブ圧縮版のインストールチュートリアル

この記事では、MySQL 5.7.18アーカイブ圧縮版をインストールする具体的な方法を参考までに紹介...

React スキャフォールディングの構築方法を学ぶ

1. フロントエンドエンジニアリングの複雑さいくつかの小さなデモ プログラムを開発するだけであれば、...

HTML テーブル マークアップ チュートリアル (41): テーブル ヘッダーの幅と高さの属性 WIDTH、HEIGHT

デフォルトでは、ヘッダーの幅と高さはコンテンツに応じて自動的に調整されます。ヘッダーの幅と高さを手動...