Ich verwende die folgende Logik, um die i18n-Zeichenfolge des angegebenen Schlüssels abzurufen.
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];
}
Ich verwende ESLint in meinem Projekt. Ich erhalte die folgende Fehlermeldung:
Greifen Sie nicht vom Zielobjekt auf die Object.prototype-Methode 'hasOwnProperty' zu. Es handelt sich um einen Fehler ohne Prototyp .
Wie ändere ich meinen Code, um diesen Fehler zu beheben? Ich möchte diese Regel nicht deaktivieren.
javascript
ecmascript-6
eslint
booYah
quelle
quelle
Object.hasOwnProperty(entries,key)
?entries
, ignoriertkey
und überprüft, obObject
eine Eigenschaft mit dieser Zeichenfolge vorhanden ist.Antworten:
Sie können darauf zugreifen über
Object.prototype
:Object.prototype.hasOwnProperty.call(obj, prop);
Das sollte sicherer sein, weil
Object.prototype
Object.prototype
, könnte diehasOwnProperty
Methode durch etwas anderes beschattet werden.Der obige Code geht natürlich davon aus
Object
wurde nicht beschattet oder neu definiertObject.prototype.hasOwnProperty
wurde nicht neu definiertcall
eigenes Eigentum hinzugefügtObject.prototype.hasOwnProperty
Function.prototype.call
wurde nicht neu definiertWenn dies nicht zutrifft und Sie versuchen, sicherer zu codieren, haben Sie möglicherweise Ihren Code beschädigt!
Ein anderer Ansatz, der nicht benötigt wird,
call
wäre!!Object.getOwnPropertyDescriptor(obj, prop);
quelle
Für Ihren speziellen Fall gelten die folgenden Beispiele:
if(Object.prototype.hasOwnProperty.call(entries, "key")) { //rest of the code }
ODER
if(Object.prototype.isPrototypeOf.call(entries, key)) { //rest of the code }
ODER
if({}.propertyIsEnumerable.call(entries, "key")) { //rest of the code }
quelle
Es scheint, dass dies auch funktionieren würde:
key in entries
da dies einen Booleschen Wert zurückgibt, ob der Schlüssel im Objekt vorhanden ist oder nicht?
quelle
hasOwnProperty
prüft, ob eine Zeichenfolge oder ein Symbol eine eigene Eigenschaft ist.key in entries
prüft, ob es sich um eine eigene oder eine geerbte handelt.Ich hoffe, ich werde dafür nicht herabgestimmt, wahrscheinlich auch, aber!
var a = {b: "I'm here"} if (a["b"]) { console.log(a["b"]) } if (a["c"]) { console.log("Never going to happen") }
Hat, soweit ich meinen Code nie gebrochen habe 😬 Aber ich bin mir nicht sicher, ob dies in allen Webbrowsern der Fall ist ...
(Auch wenn
Canadarm
undefiniert ist, scheint Ihr Codereturn entries[key];
auch dann, wenn der Schlüssel nicht in den Einträgen enthalten ist ...)quelle
a
ein Prototyp vorhanden ist, der dies tutc
, dies passieren wird. Js wird die Prototypenkette hochfahren