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.
javascript
ecmascript-6
eslint
booYah
fuente
fuente

Object.hasOwnProperty(entries,key)?entries, ignorarákeyy comprobará siObjecttiene una propiedad con esa cadena.Respuestas:
Puede acceder a él a través de
Object.prototype:Object.prototype.hasOwnProperty.call(obj, prop);Eso debería ser más seguro, porque
Object.prototypeObject.prototype, elhasOwnPropertymétodo podría ser sombreado por otra cosa.Por supuesto, el código anterior asume que
Objectno ha sido ensombrecido ni redefinidoObject.prototype.hasOwnPropertyno se ha redefinidocallse ha agregado ninguna propiedad propia aObject.prototype.hasOwnPropertyFunction.prototype.callno se ha redefinidoSi 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);fuente
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 }fuente
Parece que esto también funcionaría:
key in entriesya que devolverá un booleano sobre si la clave existe o no dentro del objeto?
fuente
hasOwnPropertycomprueba si una cadena o símbolo es una propiedad propia.key in entriescomprueba si es propio o heredado.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 parecereturn entries[key];incluso si la clave no está en las entradas ...)fuente
atiene un prototipo que TIENEc, eso sucederá. Js subirá por la cadena de prototipos