ホームページ  >  記事  >  ウェブフロントエンド  >  es6 での has() の使用法は何ですか?

es6 での has() の使用法は何ですか?

WBOY
WBOYオリジナル
2022-04-26 11:06:083703ブラウズ

es6 では、 has() メソッドは HasProperty 操作をインターセプトするために使用され、特定のプロパティを非表示にするためにも使用できます。このメソッドは関数の in 演算子として機能し、プロパティがあるかどうかを示すブール値を返します。自己所有または継承された属性の場合、構文は「Reflect.has (属性を検索するターゲット オブジェクト、チェックされる属性)」です。

es6 での has() の使用法は何ですか?

このチュートリアルの動作環境: Windows 10 システム、ECMAScript バージョン 6.0、Dell G3 コンピューター。

es6 での has() の使用法

has は関数の in 演算子として使用され、自己所有の属性があるか継承された属性があるかを示すブール値を返します。

関数 has() の構文を以下に示します。

  • target は、属性が見つかるターゲット オブジェクトです。

  • propertyKey は、チェックするプロパティの名前です。

Reflect.has(target, propertyKey)

has() メソッドは、HasProperty 操作をインターセプトするために使用されます。つまり、オブジェクトに特定の属性があるかどうかを判断するときに、このメソッドが有効になります。典型的な演算は in 演算子です。

has() メソッドは、ターゲット オブジェクトとクエリ対象の属性名という 2 つのパラメータを受け入れることができます。

has() メソッドを使用して、特定の属性が in 演算子によって検出されないようにします。

var handler = {
  has(target, key) {
    if (key[0] === "_") {
      return false;
    }
    return key in target;
  },
};
var target = { _prop: "foo", prop: "foo" };
var proxy = new Proxy(target, handler);
"_prop" in proxy; // false

元のオブジェクトの属性名の最初の文字がアンダースコアの場合、proxy.has() は false を返し、in 演算子によって検出されません。

元のオブジェクトが構成可能でない場合、または拡張が禁止されている場合、has() インターセプトはエラーを報告します。

var obj = { a: 10 };
Object.presentExtensions(obj);
var p = new Proxy(obj, {
  has: function(target, prop) {
    return false;
  },
});
"a" in p; // TypeError is thrown

上記のコードでは、obj オブジェクトの展開が禁止されているため、has を使用してインターセプトするとエラーが報告されます。つまり、プロパティが構成可能でない場合 (またはターゲット オブジェクトが拡張可能でない場合)、 has() メソッドはターゲット オブジェクトのプロパティを「非表示」にしてはなりません (つまり false を返します)。

has() メソッドは、HasOwnProperty 操作ではなく、HasProperty 操作をインターセプトすることに注意してください。つまり、has() メソッドは、プロパティがオブジェクト自身のプロパティであるか継承されたプロパティであるかを判断しません。

さらに、for...in ループでも in 演算子が使用されますが、has() インターセプトは for...in ループでは有効になりません。

let stu1 = { name: "lily", score: 59 };
let stu2 = { name: "lucy", score: 99 };
let handler = {
  has(target, prop) {
    if (prop === "score" && target[prop] < 60) {
      console.log(`${target.name} 不及格`);
      return false;
    }
    return prop in target;
  },
};
let oproxy1 = new Proxy(stu1, handler);
let oproxy2 = new Proxy(stu2, handler);
"score" in oproxy1;
// lily 不及格
// false
"score" in oproxy2;
// true
for (let a in oproxy1) {
  console.log(oproxy1[a]);
}
// lily
// 59
for (let b in oproxy2) {
  console.log(oproxy2[b]);
}
// lucy
// 99

上記のコードでは、has() インターセプトは in 演算子に対してのみ有効であり、for...in ループに対しては有効ではないため、要件を満たさない属性は for によって除外されません。 ..ループ中。

【関連する推奨事項: JavaScript ビデオ チュートリアル Web フロントエンド ]

以上がes6 での has() の使用法は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。