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 ブート プログラムの暗号化の概要

推薦する

Vueで配列の変更を監視する方法

目次序文ソースコード学習の第一歩はどこから始めればよいでしょうか?写真から始めましょうソースコードを...

Javascript 操作メカニズム イベントループ

目次1. 4つのコンセプト1. JavaScriptはシングルスレッドです2. タスクキュー3. 同...

SQL における参照整合性の詳細な説明 (1 対 1、1 対多、多対多)

1. 参照整合性参照整合性とは、主に外部キー制約を使用した複数のテーブル間の設計を指します。複数テ...

MySQL の主キーとトランザクションの詳細な説明

目次1. MySQLの主キーとテーブルフィールドに関するコメント1. 主キーと自動増分2. テーブル...

Vue フォーム入力バインディング v-model

目次1.vモデル2. プロパティとイベントのバインディング3. フォーム要素のバインディング3.1 ...

MySQL 5.7 でブロックポジショニング DDL の問題を解決する

前回の記事「MySQL テーブル構造の変更、メタデータ ロックを知っておく必要があります」では、MD...

Dockerでランナーコンテナを構成する方法

1. ランナーコンテナを作成する mk@mk-pc:~/Desktop$ docker run -d...

Docker データ ストレージ tmpfs マウントの詳細な説明

この記事を読む前に、ボリュームとバインドマウントの基本を理解しておいてください。詳細については、次の...

MySQL 8.0.13 のインストールと設定のグラフィックチュートリアル

Msyqlデータベースのインストール、参考までに具体的な内容は次のとおりです。 ①ブラウザでhttp...

Windows 10 で MySQL を完全にアンインストールして再インストールするための詳細な手順

さまざまな理由で、誰もが MySQL を再インストールする必要があると思います。 MySQL と Q...

MySQLを安全にシャットダウンする方法

MySQL サーバーをシャットダウンする場合、シャットダウン方法に応じてさまざまな問題が発生する可能...

MySQL 5.7 でパスワードを忘れた場合の解決方法の詳細な説明

環境: [root@centos7 ~]# uname -r 3.10.0-514.el7.x86_...

MySQLのあいまいクエリインデックスの失敗の問題を解決するいくつかの方法

% ワイルドカードを使用すると、インデックス失敗の問題が発生することがよくあります。ここでは、lik...

EDMをHTMLで記述する際の注意点まとめ(メール送信時の一般的な注意点)

フォーマットエンコーディング1. ページの幅は600~800px、長さは1024px以内に設定してく...

Linux でコマンドまたはプロセスの実行時間を調べる方法

Unix ライクなシステムでは、コマンドまたはプロセスの実行がいつ開始されたか、またプロセスがどのく...