Я использую следующую логику, чтобы получить строку i18n данного ключа.
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];
}
Я использую ESLint в своем проекте. Я получаю следующую ошибку:
Не обращайтесь к методу hasOwnProperty Object.prototype из целевого объекта. Это ошибка « нет встроенных прототипов ».
Как мне изменить свой код, чтобы устранить эту ошибку? Я не хочу отключать это правило.
javascript
ecmascript-6
eslint
буYah
источник
источник
Object.hasOwnProperty(entries,key)
?entries
, игнорироватьkey
и проверять,Object
есть ли свойство с этой строкой.Ответы:
Вы можете получить к нему доступ через
Object.prototype
:Object.prototype.hasOwnProperty.call(obj, prop);
Это должно быть безопаснее, потому что
Object.prototype
Object.prototype
,hasOwnProperty
метод может быть затенен чем-то другим.Конечно, приведенный выше код предполагает, что
Object
не было затенено или переопределеноObject.prototype.hasOwnProperty
не было переопределеноcall
собственной собственности не добавленоObject.prototype.hasOwnProperty
Function.prototype.call
не было переопределеноЕсли что-то из этого не выполняется, пытаясь кодировать более безопасным способом, вы могли бы сломать свой код!
Другой подход, который не нужен,
call
был бы!!Object.getOwnPropertyDescriptor(obj, prop);
источник
Для вашего конкретного случая подойдут следующие примеры:
if(Object.prototype.hasOwnProperty.call(entries, "key")) { //rest of the code }
ИЛИ
if(Object.prototype.isPrototypeOf.call(entries, key)) { //rest of the code }
ИЛИ
if({}.propertyIsEnumerable.call(entries, "key")) { //rest of the code }
источник
Похоже, это тоже сработает:
key in entries
так как это вернет логическое значение о том, существует ли ключ внутри объекта?
источник
hasOwnProperty
проверяет, является ли строка или символ собственным свойством.key in entries
проверяет, является ли он собственным или унаследованным.Я надеюсь, что меня не проголосуют за это, возможно, получится, но!
var a = {b: "I'm here"} if (a["b"]) { console.log(a["b"]) } if (a["c"]) { console.log("Never going to happen") }
До сих пор не нарушал мой код 😬 Но я не уверен, так ли это во всех веб-браузерах ...
(Кроме того, если
Canadarm
не определено, ваш код кажется,return entries[key];
даже если ключ отсутствует в записях ...)источник
a
есть прототип, который ДЕЙСТВИТЕЛЬНО естьc
, это произойдет. Js поднимется по цепочке прототипов