Come si accede al metodo Object.prototype nella seguente logica?


94

Sto usando la seguente logica per ottenere la stringa i18n della chiave data.

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

Sto usando ESLint nel mio progetto. Ricevo il seguente errore:

Non accedere al metodo Object.prototype "hasOwnProperty" dall'oggetto di destinazione. È un errore " no-prototype-builtins ".

Come cambio il mio codice per risolvere questo errore? Non voglio disabilitare questa regola.


10
Probabilmente dovresti leggere i documenti. Ci sono esempi di codice corretto ~ eslint.org/docs/rules/no-prototype-builtins
Phil

1
Suggerire di utilizzare Object.hasOwnProperty(entries,key)?
passione

Il codice funziona bene. Questo è un errore di lanugine. Voglio solo modificare la sintassi in modo che la regola di linting sia soddisfatta.
booYah

1
@passion That stringerà entries, ignorerà keye controllerà se Objectha una proprietà con quella stringa.
Oriol

Risposte:


164

Puoi accedervi tramite Object.prototype:

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

Dovrebbe essere più sicuro, perché

  • Non tutti gli oggetti ereditano da Object.prototype
  • Anche per oggetti che ereditano da Object.prototype, il hasOwnPropertymetodo potrebbe essere oscurato da qualcos'altro.

Ovviamente, il codice sopra lo presume

  • Il globale Objectnon è stato oscurato o ridefinito
  • Il nativo Object.prototype.hasOwnPropertynon è stato ridefinito
  • Nessuna callproprietà è stata aggiunta aObject.prototype.hasOwnProperty
  • Il nativo Function.prototype.callnon è stato ridefinito

Se qualcuno di questi non regge, tentando di codificare in modo più sicuro, potresti aver rotto il tuo codice!

Un altro approccio che non ha bisogno callsarebbe

!!Object.getOwnPropertyDescriptor(obj, prop);

16

Per il tuo caso specifico, i seguenti esempi funzioneranno:

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

O

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

O

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

11

Sembra che funzionerebbe anche:

key in entries

dato che restituirà un valore booleano se la chiave esiste o meno all'interno dell'oggetto?


3
hasOwnPropertycontrolla se una stringa o un simbolo è una proprietà propria. key in entriescontrolla se è proprio o ereditato.
Oriol

0

Spero di non essere sottovalutato per questo, probabilmente lo farò, ma!

var a = {b: "I'm here"}
if (a["b"]) { console.log(a["b"]) }
if (a["c"]) { console.log("Never going to happen") }

Pertanto, non ha mai violato il mio codice 😬 Ma non sono sicuro che sia così in tutti i browser web ...

(Inoltre, se Canadarmnon è definito, il tuo codice sembra return entries[key];anche se la chiave non è nelle voci ...)


1
Il problema è che se aha un prototipo che HA c, succederà. Js salirà la catena dei prototipi
Bernardo Dal Corno
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.