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.


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);

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
}

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?


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 ...)


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.