Używam następującej logiki, aby uzyskać ciąg i18n podanego klucza.
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];
}
W moim projekcie używam ESLint. Otrzymuję następujący błąd:
Nie uzyskuj dostępu do metody Object.prototype „hasOwnProperty” z obiektu docelowego. Jest to błąd typu „ brak wbudowanych prototypów ”.
Jak zmienić kod, aby rozwiązać ten błąd? Nie chcę wyłączać tej reguły.
javascript
ecmascript-6
eslint
booYah
źródło
źródło
Object.hasOwnProperty(entries,key)
?entries
, ignorowaćkey
i sprawdzać, czyObject
ma właściwość z tym ciągiem.Odpowiedzi:
Możesz uzyskać do niego dostęp przez
Object.prototype
:Object.prototype.hasOwnProperty.call(obj, prop);
To powinno być bezpieczniejsze, ponieważ
Object.prototype
Object.prototype
,hasOwnProperty
metoda może być zasłonięta czymś innym.Oczywiście powyższy kod zakłada, że
Object
nie została zastąpiona cieniem ani przedefiniowanaObject.prototype.hasOwnProperty
nie został przedefiniowanycall
własna nieruchomość nie została dodana doObject.prototype.hasOwnProperty
Function.prototype.call
nie został przedefiniowanyJeśli któryś z nich nie działa, próbując kodować w bezpieczniejszy sposób, mogłeś złamać kod!
Innym podejściem, które nie musi
call
być!!Object.getOwnPropertyDescriptor(obj, prop);
źródło
W Twoim konkretnym przypadku sprawdzą się następujące przykłady:
if(Object.prototype.hasOwnProperty.call(entries, "key")) { //rest of the code }
LUB
if(Object.prototype.isPrototypeOf.call(entries, key)) { //rest of the code }
LUB
if({}.propertyIsEnumerable.call(entries, "key")) { //rest of the code }
źródło
Wygląda na to, że to również zadziała:
key in entries
ponieważ to zwróci wartość logiczną o tym, czy klucz istnieje wewnątrz obiektu?
źródło
hasOwnProperty
sprawdza, czy ciąg lub symbol jest własną własnością.key in entries
sprawdza, czy jest to własność, czy dziedziczenie.Mam nadzieję, że prawdopodobnie nie zostanę za to odrzucony, prawdopodobnie tak, ale!
var a = {b: "I'm here"} if (a["b"]) { console.log(a["b"]) } if (a["c"]) { console.log("Never going to happen") }
Jak dotąd nigdy nie złamał mojego kodu Ale nie jestem pewien, czy tak jest we wszystkich przeglądarkach internetowych ...
(Ponadto, jeśli
Canadarm
jest niezdefiniowany, wydaje się, że kod wydaje się,return entries[key];
nawet jeśli klucza nie ma we wpisach ...)źródło
a
ma prototyp, który MAc
, to się wydarzy. Js wejdzie w górę łańcucha prototypów