Как получить доступ к методу Object.prototype в следующей логике?
Я использую следующую логику, чтобы получить строку 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 в своем проекте. Я получаю следующую ошибку:
Не используйте метод Object.prototype 'hasOwnProperty' из целевого объекта. Это ошибка "нет прототипов".
Как мне изменить код для устранения этой ошибки? Я не хочу отключать это правило.
Ответы
Ответ 1
Вы можете получить доступ к нему через Object.prototype
:
Object.prototype.hasOwnProperty.call(obj, prop);
Это должно быть безопаснее, потому что
- Не все объекты наследуются от
Object.prototype
- Даже для объектов, которые наследуются от
Object.prototype
, метод hasOwnProperty
может быть затенен чем-то другим.
Конечно, в приведенном выше коде предполагается, что
- Глобальный
Object
не был затенен или переопределен
- Нативный
Object.prototype.hasOwnProperty
не был переопределен
- В
Object.prototype.hasOwnProperty
добавлено собственное свойство
call
Нативный Function.prototype.call
не был переопределен
Если какой-либо из них не выполняется, попытка более безопасным образом кодировать, вы могли бы сломать свой код!
Другим подходом, который не нужен call
, будет
!!Object.getOwnPropertyDescriptor(obj, prop);
Ответ 2
Кажется, что это также сработало бы:
key in entries
так как это вернет логическое значение на том, существует или нет ключ внутри объекта?
Ответ 3
Для вашего конкретного случая подойдут следующие примеры:
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
}