Как получить доступ к методу 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
}