Maison >interface Web >Questions et réponses frontales >Quelle est l'utilité de has() dans es6 ?

Quelle est l'utilité de has() dans es6 ?

WBOY
WBOYoriginal
2022-04-26 11:06:083728parcourir

Dans es6, la méthode has() est utilisée pour intercepter les opérations HasProperty et peut également être utilisée pour masquer certaines propriétés ; cette méthode sert d'opérateur in de la fonction et renvoie une valeur booléenne indiquant s'il existe des propriétés propres ou héritées. La syntaxe est la suivante : "Reflect.has (objet cible pour rechercher les propriétés, propriétés à vérifier)".

Quelle est l'utilité de has() dans es6 ?

L'environnement d'exploitation de ce tutoriel : système Windows 10, ECMAScript version 6.0, ordinateur Dell G3.

À quoi sert has() dans es6 ?

has est utilisé comme opérateur in de la fonction. Il renvoie une valeur booléenne indiquant s'il existe un attribut propre ou hérité.

La syntaxe de la fonction has() est donnée ci-dessous, où

  • target est l'objet cible dans lequel se trouve l'attribut.

  • propertyKey est le nom de la propriété à vérifier. La méthode

Reflect.has(target, propertyKey)

has() est utilisée pour intercepter l'opération HasProperty, c'est-à-dire que pour déterminer si l'objet a une certaine propriété, cette méthode prendra effet. Une opération typique est l'opérateur in. La méthode

has() peut accepter deux paramètres, qui sont l'objet cible et le nom de l'attribut à interroger.

Utilisez la méthode has() pour empêcher certains attributs d'être découverts par l'opérateur 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

Si le premier caractère du nom de propriété de l'objet d'origine est un trait de soulignement, proxy.has() renverra false et ne sera pas découvert par l'opérateur in.

Si l'objet d'origine n'est pas configurable ou si l'expansion est interdite, l'interception has() signalera une erreur.

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

Dans le code ci-dessus, l'objet obj ne peut pas être développé et, par conséquent, une erreur sera signalée si has est utilisé pour l'intercepter. Autrement dit, si une propriété n'est pas configurable (ou si l'objet cible n'est pas extensible), la méthode has() ne doit pas "masquer" (c'est-à-dire renvoyer false) la propriété de l'objet cible.

Il convient de noter que la méthode has() intercepte l'opération HasProperty, pas l'opération HasOwnProperty, c'est-à-dire que la méthode has() ne détermine pas si une propriété est la propriété propre de l'objet ou une propriété héritée.

De plus, bien que la boucle for...in utilise également l'opérateur in, l'interception has() ne prend pas d'effet sur la boucle 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

Dans le code ci-dessus, l'interception has() ne prend effet que pour l'opérateur in et non pour la boucle for...in, ce qui fait que les attributs qui ne répondent pas aux exigences ne sont pas exclus par la boucle for...in. .

【Recommandations associées : tutoriel vidéo javascript, front-end web

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn