次のロジックでObject.prototypeメソッドにアクセスするにはどうすればよいですか?


94

次のロジックを使用して、指定されたキーの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'にアクセスしないでください。これは「no-prototype-builtins」エラーです。

このエラーを解決するためにコードを変更するにはどうすればよいですか?このルールを無効にしたくありません。


10
おそらくドキュメントを読む必要があります。正しいコードの例があります〜eslint.org / docs / rules / no
Phil

1
使用を提案しますObject.hasOwnProperty(entries,key)か?
情熱

コードは正常に機能しています。これはリンティングエラーです。リンティングルールが満たされるように構文を変更したいだけです。
booYah 2016

1
@passionこれentriesにより、文字列化され、無視されkeyObjectその文字列を持つプロパティがあるかどうかが確認されます。
オリオール

回答:


162

あなたはそれを介してアクセスすることができますObject.prototype

Object.prototype.hasOwnProperty.call(obj, prop);

それはより安全なはずです。

  • すべてのオブジェクトが継承するわけではありません Object.prototype
  • から継承するオブジェクトの場合でもObject.prototypehasOwnPropertyメソッドは他の何かによってシャドウされる可能性があります。

もちろん、上記のコードは

  • グローバルObjectはシャドウイングまたは再定義されていません
  • ネイティブObject.prototype.hasOwnPropertyは再定義されていません
  • call独自のプロパティは追加されていませんObject.prototype.hasOwnProperty
  • ネイティブFunction.prototype.callは再定義されていません

これらのいずれかが当てはまらず、より安全な方法でコーディングしようとすると、コードが壊れた可能性があります。

必要のない別のアプローチcallになります

!!Object.getOwnPropertyDescriptor(obj, prop);

15

特定のケースでは、次の例が機能します。

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それが自分のものか継承されたものかをチェックします。
オリオール2016

0

私はこれに反対票を投じないことを願っています、おそらくそうするでしょう、しかし!

var a = {b: "I'm here"}
if (a["b"]) { console.log(a["b"]) }
if (a["c"]) { console.log("Never going to happen") }

これまでのところ、私のコードを壊したことはありません😬しかし、すべてのWebブラウザーに当てはまるかどうかはわかりません...

(また、Canadarmが定義されreturn entries[key];ていない場合、キーがエントリに含まれていなくてもコードは表示されます...)


1
問題は、もしa持っているプロトタイプがあればc、それが起こるだろうということです。Jsはプロトタイプチェーンを上っていきます
Bernardo DalCorno20年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.