2016-09-02 8 views
10

次のロジックを使用して、指定されたキーのi18n文字列を取得しています。次のロジックでObject.prototypeメソッドにアクセスするにはどうすればよいですか?

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を使用しています。次のエラーが表示されます。

Do not access Object.prototype method 'hasOwnProperty' from target object. It is a 'no-prototype-builtins' error.

このエラーを解決するにはどうすればコードを変更できますか?私はこのルールを無効にしたくない。

+3

おそらくドキュメントを読むべきです。 *正しい*コードの例があります〜http://eslint.org/docs/rules/no-prototype-builtins – Phil

+1

'Object.hasOwnProperty(entries、key)'の使用をお勧めしますか? – passion

+1

私はこのトピックを文書で解答しているので(トピック:dr〜RTFM) – Phil

答えて

22

あなたはObject.prototype経由でアクセスすることができます。

  • は、すべてのオブジェクトが、でもObject.prototypeから継承するオブジェクトのためのObject.prototype
  • からhasOwnPropertyメソッドを継承していないので、より安全でなければなりません

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

    を他の何かによって隠される可能性があります。もちろん

、上記のコードは、ネイティブObject.prototype.hasOwnProperty

  • を再定義されていない
    • はグローバルObjectが影のか、再定義されていないんcall自身のプロパティが追加されていないことを前提としていObject.prototype.hasOwnProperty
    • ネイティブFunction.prototype.callは再定義されていません

    これらのいずれかが成立しない場合、より安全な方法でコードを作成しようとすると、コードが壊れている可能性があります。

    これもうまくいくように思えcall

    ​​
  • 2

    だろう必要はありません。別のアプローチ:

    key in entries

    それはキーが存在するかどうかにブール値を返しますので、オブジェクトの中に?

    +0

    'hasOwnProperty'は、文字列またはシンボルが独自のプロパティであるかどうかをチェックします。 'key in entries'は、それが自分のものか継承されたものかをチェックします。 – Oriol

    関連する問題