JavaScript Proxyオブジェクトの詳細な説明

JavaScript Proxyオブジェクトの詳細な説明

1. プロキシとは何ですか?

Proxy オブジェクトは、ターゲット オブジェクトの指定された操作を傍受および変更するために使用されます。

// 構文 const p = new Proxy(target, handler)
  • target : ターゲット オブジェクト (ネイティブ配列、関数、または別のプロキシを含む、任意のタイプのオブジェクトにすることができます)。
  • ハンドラー: インターセプションとカスタム操作を実装するための関数を属性として持つオブジェクト。

2. 使い方は?

1. プロキシを使用する簡単な例

存在しないプロパティにアクセスする場合は、undefined ではなくデフォルト値を返すように設定します。

// 1. 適切なハンドラを見つけてコードを記述する const handler = {
    取得: 関数(obj, prop) {
        obj 内の prop を返します。obj[prop] : 37;
    }
};
// 2. 新しい Proxy オブジェクトを作成します。const p = new Proxy({}, handler);
// 3. 操作を実行する pa = 1;
pb = 未定義;
// 4. 結果を確認する console.log(pa, pb); // 1, undefined
console.log('c' in p, pc); // 偽、37

2. 対象オブジェクトが正しく変更されている

ターゲットを{}とします。
p = new Proxy(target, {}); とします。
pa = 37; // 操作はターゲットに転送されます console.log(target.a); // 37. 操作は正しく転送されました

3. データ検証にセットハンドラを使用する

バリデーター = {
  設定: 関数(オブジェクト、プロパティ、値) {
    (prop === '年齢')の場合{
      if (!Number.isInteger(値)) {
        throw new TypeError('年齢は整数ではありません');
      }
      (値>200)の場合{
        throw new RangeError('年齢が無効なようです');
      }
    }
    // 値を保存するデフォルトの動作
    obj[prop] = 値;
    // 成功を示します。true を返します。
  }
};
person = new Proxy({}, validator); とします。
人.年齢 = 100;
console.log(人.年齢);
// 100
person.age = '若い';
// 例外がスローされます: Uncaught TypeError: 年齢が整数ではありません
人.年齢 = 300;
// 例外をスローします: Uncaught RangeError: 年齢が無効のようです

4. 拡張コンストラクタ

関数extend(sup, base) {
  var 記述子 = Object.getOwnPropertyDescriptor(
    base.prototype、「コンストラクタ」
  );
  base.prototype = Object.create(sup.prototype);
  var ハンドラ = {
    構築: 関数(ターゲット、引数) {
      var obj = Object.create(base.prototype);
      this.apply(ターゲット、オブジェクト、引数);
      obj を返します。
    },
    適用: 関数(ターゲット、その、引数) {
      sup.apply(それ、引数);
      base.apply(それ、引数);
    }
  };
  var proxy = 新しい Proxy(base, handler);
  記述子.値 = プロキシ;
  Object.defineProperty(base.prototype、"コンストラクタ"、記述子);
  プロキシを返します。
}
var Person = 関数 (名前) {
  this.name = 名前
};
var Boy = extend(Person, 関数 (名前, 年齢) {
  this.age = 年齢;
});
Boy.prototype.sex = "M";
var Peter = new Boy("Peter", 13);
console.log(Peter.sex); // "M"
console.log(Peter.name); // "ピーター"
console.log(Peter.age); // 13

要約する

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

以下もご興味があるかもしれません:
  • JavaScript のプロキシ オブジェクト
  • jsプロキシの原理の詳細な説明
  • JSはあなたをプロキシの世界に深く導きます
  • JavaScript における ES6 プロキシの具体的な使用法
  • JavaScript Proxy ではどのような興味深いことができるのでしょうか?

<<:  システム外のフォント参照とトランジション効果

>>:  Linux の GRUB ブート プログラムの暗号化の概要

推薦する

DHTML オブジェクト (さまざまな HTML オブジェクトの共通プロパティ)

!DOCTYPE HTML ドキュメントが準拠するドキュメント型定義 (DTD) を指定します。 ...

Vue で jsx 構文を正しく使用する方法

目次序文仮想DOM仮想DOMとは仮想DOMの利点レンダリング関数とは何ですか? jsx Vue3 で...

Elimination の JavaScript ソースコード

ゲームのソースコードのダウンロードアドレスを取得するためのJavaScript:クリックしてソースコ...

MySQL 5.7.13 のインストールと設定方法の Mac でのグラフィック チュートリアル

MySQL 5.7.13 Mac用インストールチュートリアル、非常に詳細で、以下のように記録されてい...

Win10にMySQL8圧縮パッケージ版をインストールするチュートリアル

1 公式サイトからMySQL8をダウンロードしてインストールするMySQL8 ダウンロードアドレスこ...

CPU、マシンモデル、メモリなどの情報を表示するLinuxシステム

システムメンテナンス中は、いつでも CPU 使用率を確認し、対応する情報に基づいてシステムの状態を分...

mysql maxとwhere間の実行問題の概要

mysql maxとwhereの間の実行の問題SQLを実行します: テーブル「grades」を作成し...

MySQL シリーズ II マルチインスタンス構成

チュートリアルシリーズMySQL シリーズ: MySQL リレーショナル データベースの基本概念My...

美しいチェックボックススタイル(複数選択ボックス)はIE8/9/10、FFなどと完全に互換性があります。

恥ずかしながら、このようなよく使われるチェックボックスのスタイルを変更するために、Baidu で長い...

フロントエンド Vue ユニットテストを始める

目次1. ユニットテストはなぜ必要なのでしょうか? 2. ユニットテストの書き方3. テストツール4...

MySQL の日付フォーマットと複雑な日付範囲クエリ

目次序文クエリの使用シナリオ例時間間隔クエリクエリ日付と今日の時間の比較データ一般的なサイクルタイム...

jQueryはシンプルなカルーセル効果を実装します

みなさんこんにちは。今日はカルーセルの実装についてお話しします。私が作成したカルーセルの効果は次のと...

MySQL ユーザーのホスト属性を素早く変更する方法

MySQL にリモートでログインする場合、使用するアカウントには特別な要件があります。アカウントのデ...

JS でオブジェクトが空オブジェクトかどうかを判断する 5 つの方法

1. jsonオブジェクトをjson文字列に変換し、文字列が「{}」であるかどうかを判断します。 v...

Vueはシンプルな画像切り替え効果を実装します

この記事では、Vueの具体的なコード例を参考までに紹介します。具体的な内容は以下のとおりです。 コー...