Object.hasOwnProperty() ergibt den ESLint-Fehler „no-prototype-builtins“: Wie kann man das beheben?

Lesezeit: 3 Minuten

Benutzer-Avatar
booYah

Ich verwende die folgende Logik, um die i18n-Zeichenfolge des angegebenen Schlüssels zu erhalten.

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];
}

Ich verwende ESLint in meinem Projekt. Ich erhalte den folgenden Fehler:

Greifen Sie vom Zielobjekt nicht auf die Object.prototype-Methode „hasOwnProperty“ zu. Es ist ein ‘keine Prototypen-Builts‘ Error.

Wie ändere ich meinen Code, um diesen Fehler zu beheben? Ich möchte diese Regel nicht deaktivieren.

  • Sie sollten wahrscheinlich die Dokumente lesen. Es gibt Beispiele dafür Korrekt Code ~ eslint.org/docs/rules/no-prototype-builtins

    – Phil

    2. September 2016 um 1:01 Uhr

  • Schlagen Sie vor, zu verwenden Object.hasOwnProperty(entries,key) ?

    – Hingabe

    2. September 2016 um 1:02 Uhr

  • Der Code funktioniert gut. Dies ist ein Linting-Fehler. Ich möchte nur die Syntax so ändern, dass die Linting-Regel erfüllt ist.

    – booYah

    2. September 2016 um 1:04 Uhr

  • @passion Das wird stringify entriesignorieren keyund prüfen Sie ggf Object hat eine Eigenschaft mit dieser Zeichenfolge.

    – Oriol

    2. September 2016 um 1:21 Uhr

  • @Phil Stapelüberlauf ist die Dokumente für viele.

    – HosseyNJF

    13. Juli um 11:34 Uhr

Sie können darauf zugreifen über Object.prototype:

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

Das sollte sicherer sein, weil

  • Nicht alle Objekte erben von Object.prototype
  • Auch für Objekte, die von erben Object.prototypedas hasOwnProperty Methode könnte von etwas anderem überschattet werden.

Der obige Code geht natürlich davon aus

  • Der Globus Object wurde nicht schattiert oder neu definiert
  • Der Einheimische Object.prototype.hasOwnProperty wurde nicht neu definiert
  • Nein call Eigenes Eigentum hinzugekommen ist Object.prototype.hasOwnProperty
  • Der Einheimische Function.prototype.call wurde nicht neu definiert

Wenn einer dieser Punkte nicht zutrifft, könnten Sie bei dem Versuch, auf sicherere Weise zu codieren, Ihren Code gebrochen haben!

Ein weiterer Ansatz, der nicht benötigt wird call wäre

!!Object.getOwnPropertyDescriptor(obj, prop);

  • Sie retten meinen Tag, ich muss alten Code von meinem Freund umgestalten und so viele Codezeilen ersetzen

    – Jamviet.com

    29. Juli um 19:22 Uhr

Benutzer-Avatar
Zameer Ansari

Für Ihren speziellen Fall sollen die folgenden Beispiele funktionieren:

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

ODER

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

ODER

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

  • Das letzte Beispiel (propertyIsEnumerable) funktioniert für mich danke

    – ho-s

    21. Dezember 2021 um 2:40 Uhr

Das scheint auch zu funktionieren:

key in entries

da dies einen booleschen Wert zurückgibt, ob der Schlüssel im Objekt vorhanden ist oder nicht?

  • hasOwnProperty prüft, ob ein String oder Symbol eine eigene Eigenschaft ist. key in entries prüft, ob es sich um ein eigenes oder geerbtes handelt.

    – Oriol

    3. September 2016 um 23:33 Uhr

@Orial Antwort ist richtig

Benutze das:

Object.prototype.hasOwnProperty.call(object, "objectProperty");

Sie können verwenden Object.hasOwn(entries, key) stattdessen. hatEigen soll ein Ersatz für sein Object.hasOwnProperty.

  • Dies ist der Weg ins Jahr 2022. Es hat eine gute Browserunterstützung, ist kürzer und leichter zu merken als die akzeptierte Antwort und löst das Problem, über das sich ESLint beschwert. MDN sagt, Note: Object.hasOwn() is intended as a replacement for Object.hasOwnProperty(). Sehen tomdn.com?object.hasOwn.

    – Salbury

    19. August um 15:20 Uhr


das funktioniert bei mir, also versuche es damit

let  bug={
 name:"test"
   }
if (bug && typeof bug === 'object' && Object.prototype.hasOwnProperty.call(bug, name)) {

}

  • Dies ist der Weg ins Jahr 2022. Es hat eine gute Browserunterstützung, ist kürzer und leichter zu merken als die akzeptierte Antwort und löst das Problem, über das sich ESLint beschwert. MDN sagt, Note: Object.hasOwn() is intended as a replacement for Object.hasOwnProperty(). Sehen tomdn.com?object.hasOwn.

    – Salbury

    19. August um 15:20 Uhr


1291430cookie-checkObject.hasOwnProperty() ergibt den ESLint-Fehler „no-prototype-builtins“: Wie kann man das beheben?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy