web-dev-qa-db-fra.com

Comment accéder à la méthode Object.prototype dans la logique suivante?

J'utilise la logique suivante pour obtenir la chaîne i18n de la clé donnée.

export function i18n(key) {
  if (entries.hasOwnProperty(key)) {
    return entries[key];
  } else if (typeof (Canadarm) !== 'undefined') {
    try {
      throw Error();
    } catch (e) {
      Canadarm.error(entries['dataBuildI18nString'] + key, e);
    }
  }
  return entries[key];
}

J'utilise ESLint dans mon projet. Je reçois l'erreur suivante:

N'accédez pas à la méthode Object.prototype 'hasOwnProperty' à partir de l'objet cible . C'est une erreur ' no-prototype-builtins '. 

Comment changer mon code pour résoudre cette erreur? Je ne veux pas désactiver cette règle.

23
booYah

Vous pouvez y accéder via Object.prototype:

Object.prototype.hasOwnProperty.call(obj, prop);

Cela devrait être plus sûr, parce que

  • Tous les objets n'héritent pas de Object.prototype
  • Même pour les objets qui héritent de Object.prototype, la méthode hasOwnProperty peut être ombrée par autre chose.

Bien sûr, le code ci-dessus suppose que

  • La variable globale Object n'a pas été ombragée ni redéfinie
  • Le Object.prototype.hasOwnProperty natif n'a pas été redéfini
  • Aucune propriété call n'a été ajoutée à Object.prototype.hasOwnProperty
  • Le Function.prototype.call natif n'a pas été redéfini

Si l'un de ces problèmes ne tient pas, si vous essayez de coder de manière plus sécurisée, vous pourriez avoir cassé votre code!

Une autre approche qui n’a pas besoin de call serait

!!Object.getOwnPropertyDescriptor(obj, prop);
44
Oriol

Il semble que cela fonctionnerait aussi:

key in entries

puisque cela retournera un booléen sur si la clé existe ou non à l'intérieur de l'objet?

3
Mike Mathew

Pour votre cas spécifique, les exemples suivants doivent fonctionner:

if(Object.prototype.hasOwnProperty.call(entries, "key")) {
    //rest of the code
}

OR

if(Object.prototype.isPrototypeOf.call(entries, key)) {
    //rest of the code
}

OR

if({}.propertyIsEnumerable.call(entries, "key")) {
    //rest of the code
}
0
student