¿Cómo accedo al método Object.prototype en la siguiente lógica?

91

Estoy usando la siguiente lógica para obtener la cadena i18n de la clave dada.

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

Estoy usando ESLint en mi proyecto. Estoy teniendo el siguiente error:

No acceda al método Object.prototype 'hasOwnProperty' desde el objeto de destino. Es un error " sin prototipos incorporados ".

¿Cómo cambio mi código para resolver este error? No quiero desactivar esta regla.

booYah
fuente
9
Probablemente debería leer los documentos. Hay ejemplos de código correcto ~ eslint.org/docs/rules/no-prototype-builtins
Phil
1
¿Sugerirle usar Object.hasOwnProperty(entries,key)?
pasión
El código funciona bien. Este es un error de pelusa. Solo quiero modificar la sintaxis para que se cumpla la regla de linting.
booYah
1
@passion Eso identificará entries, ignorará keyy comprobará si Objecttiene una propiedad con esa cadena.
Oriol

Respuestas:

149

Puede acceder a él a través de Object.prototype:

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

Eso debería ser más seguro, porque

  • No todos los objetos heredan de Object.prototype
  • Incluso para los objetos que heredan Object.prototype, el hasOwnPropertymétodo podría ser sombreado por otra cosa.

Por supuesto, el código anterior asume que

  • Lo global Objectno ha sido ensombrecido ni redefinido
  • Lo nativo Object.prototype.hasOwnPropertyno se ha redefinido
  • No callse ha agregado ninguna propiedad propia aObject.prototype.hasOwnProperty
  • Lo nativo Function.prototype.callno se ha redefinido

Si alguno de estos no se cumple, al intentar codificar de una manera más segura, ¡podría haber roto el código!

Otro enfoque que no es necesario callsería

!!Object.getOwnPropertyDescriptor(obj, prop);
Oriol
fuente
14

Para su caso específico, los siguientes ejemplos funcionarán:

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
}
Zameer Ansari
fuente
11

Parece que esto también funcionaría:

key in entries

ya que devolverá un booleano sobre si la clave existe o no dentro del objeto?

Mike Mathew
fuente
3
hasOwnPropertycomprueba si una cadena o símbolo es una propiedad propia. key in entriescomprueba si es propio o heredado.
Oriol
0

Espero que no me voten negativamente por esto, probablemente lo haré, ¡pero!

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

Hasta ahora, nunca ha roto mi código 😬 Pero no estoy seguro de si es el caso en todos los navegadores web ...

(Además, si Canadarmno está definido, su código parece return entries[key];incluso si la clave no está en las entradas ...)

Albert James Teddy
fuente
1
El problema es que si atiene un prototipo que TIENE c, eso sucederá. Js subirá por la cadena de prototipos
Bernardo Dal Corno