Як отримати доступ до методу Object.prototype за такою логікою?


93

Я використовую таку логіку, щоб отримати рядок 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' з цільового об'єкта. Це помилка " не вбудований прототип ".

Як змінити код, щоб усунути цю помилку? Я не хочу відключати це правило.


9
Ймовірно, вам слід прочитати документи. Є приклади правильного коду ~ eslint.org/docs/rules/no-prototype-builtins
Філ

1
Запропонувати використовувати Object.hasOwnProperty(entries,key)?
пристрасть

Код працює нормально. Це помилка підключення. Я просто хочу змінити синтаксис, щоб було виконано правило зв’язку.
booYah 02

1
@passion Це буде строкувати entries, ігнорувати keyта перевіряти, чи Objectмає властивість цей рядок.
Oriol 02

Відповіді:


151

Ви можете отримати доступ до нього через 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);

14

Для Вашого конкретного випадку будуть працювати наступні приклади:

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
}

11

Здається, це також спрацює:

key in entries

оскільки це поверне логічне значення щодо того, чи існує ключ всередині об'єкта чи ні?


3
hasOwnPropertyперевіряє, чи рядок або символ є власною властивістю. key in entriesперевіряє, чи є він власним чи успадкованим.
Oriol

0

Я сподіваюся, що за це я не отримаю голосу, мабуть, але!

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];навіть якщо ключа немає в записах ...)


1
Проблема полягає в тому, що якщо aє прототип, який є c, це відбудеться. Js піде вгору по прототипу
Бернардо Дал Корно,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.