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.
javascript
ecmascript-6
eslint
booYah
fonte
fonte
Object.hasOwnProperty(entries,key)
?entries
, ignorarkey
e verificar seObject
tem uma propriedade com aquela string.Respostas:
Você pode acessá-lo via
Object.prototype
:Object.prototype.hasOwnProperty.call(obj, prop);
Isso deveria ser mais seguro, porque
Object.prototype
Object.prototype
, ohasOwnProperty
método pode ser obscurecido por outra coisa.Claro, o código acima assume que
Object
não foi obscurecido ou redefinidoObject.prototype.hasOwnProperty
não foi redefinidocall
propriedade própria foi adicionada aObject.prototype.hasOwnProperty
Function.prototype.call
não foi redefinidoSe algum desses não funcionar, tentando codificar de maneira mais segura, você pode ter quebrado seu código!
Outra abordagem que não precisa
call
seria!!Object.getOwnPropertyDescriptor(obj, prop);
fonte
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 }
fonte
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?
fonte
hasOwnProperty
verifica se uma string ou símbolo é uma propriedade própria.key in entries
verifica se é próprio ou herdado.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
Canadarm
for indefinido, seu código parecerá,return entries[key];
mesmo se a chave não estiver nas entradas ...)fonte
a
tem um protótipo que TEMc
, isso vai acontecer. Js vai subir na cadeia de protótipos