Como acesso o método Object.prototype na seguinte lógica?

94

Estou usando a seguinte lógica para obter a string i18n da chave fornecida.

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

Estou usando ESLint em meu projeto. Eu estou recebendo o seguinte erro:

Não acesse o método Object.prototype 'hasOwnProperty' do objeto de destino. É um erro ' sem protótipo embutido '.

Como altero meu código para resolver esse erro? Eu não quero desativar esta regra.

booYah
fonte
10
Você provavelmente deve ler os documentos. Existem exemplos de código correto ~ eslint.org/docs/rules/no-prototype-builtins
Phil
1
Sugiro que você use Object.hasOwnProperty(entries,key)?
paixão
O código está funcionando bem. Este é um erro de linting. Eu apenas quero modificar a sintaxe para que a regra de linting seja satisfeita.
booYah
1
@passion Isso irá stringificar entries, ignorar keye verificar se Objecttem uma propriedade com aquela string.
Oriol

Respostas:

164

Você pode acessá-lo via Object.prototype:

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

Isso deveria ser mais seguro, porque

  • Nem todos os objetos herdam de Object.prototype
  • Mesmo para objetos que herdam de Object.prototype, o hasOwnPropertymétodo pode ser obscurecido por outra coisa.

Claro, o código acima assume que

  • O global Objectnão foi obscurecido ou redefinido
  • O nativo Object.prototype.hasOwnPropertynão foi redefinido
  • Nenhuma callpropriedade própria foi adicionada aObject.prototype.hasOwnProperty
  • O nativo Function.prototype.callnão foi redefinido

Se algum desses não funcionar, tentando codificar de maneira mais segura, você pode ter quebrado seu código!

Outra abordagem que não precisa callseria

!!Object.getOwnPropertyDescriptor(obj, prop);
Oriol
fonte
16

Para o seu caso específico, os seguintes exemplos devem funcionar:

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

OU

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

OU

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

Parece que isso também funcionaria:

key in entries

já que isso retornará um booleano sobre se a chave existe ou não dentro do objeto?

Mike Mathew
fonte
3
hasOwnPropertyverifica se uma string ou símbolo é uma propriedade própria. key in entriesverifica se é próprio ou herdado.
Oriol
0

Espero não ser rejeitado por isso, provavelmente será, mas!

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

Na medida em que, nunca quebrou meu código 😬 Mas não tenho certeza se é o caso em todos os navegadores da web ...

(Além disso, se Canadarmfor indefinido, seu código parecerá, return entries[key];mesmo se a chave não estiver nas entradas ...)

Albert James Teddy
fonte
1
O problema é que se atem um protótipo que TEM c, isso vai acontecer. Js vai subir na cadeia de protótipos
Bernardo Dal Corno