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ákey
y comprobará siObject
tiene 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.prototype
Object.prototype
, elhasOwnProperty
método podría ser sombreado por otra cosa.Por supuesto, el código anterior asume que
Object
no ha sido ensombrecido ni redefinidoObject.prototype.hasOwnProperty
no se ha redefinidocall
se ha agregado ninguna propiedad propia aObject.prototype.hasOwnProperty
Function.prototype.call
no 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
call
serí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 entries
ya que devolverá un booleano sobre si la clave existe o no dentro del objeto?
fuente
hasOwnProperty
comprueba si una cadena o símbolo es una propiedad propia.key in entries
comprueba 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
Canadarm
no está definido, su código parecereturn entries[key];
incluso si la clave no está en las entradas ...)fuente
a
tiene un prototipo que TIENEc
, eso sucederá. Js subirá por la cadena de prototipos