ESlintを導入したらhasOwnProperty
を使っている箇所でエラーがでた
hasOwnProperty
はObject.prototypesにビルトインされている関数で、オブジェクトに引数で指定したキーがあるかを判別する関数
エラーがでた使い方は以下
var hasBarProperty = foo.hasOwnProperty("bar");
Disallow use of Object.prototypes builtins directly (no-prototype-builtins)
というメッセージでObject.prototypesビルトインの直接使用を禁止するというもの
なぜ禁止かというと
例えば、悪意のあるクライアントが{"hasOwnProperty": 1}
のようなJSON値を送信した場合、オブジェクトに含まれるhasOwnProperty
が、Object.prototypeビルトインをシャドーイングしてしまい、意図しない動作やサービス拒否のセキュリティの脆弱性を引き起こす可能性がある
このようなバグを回避するため、常にこれらのメソッドをObject.prototype
から呼び出すことを推奨している
コードの正誤例
上で貼ったESlintドキュメントに記載されていた例
誤ったコードの例
/*eslint no-prototype-builtins: "error"*/ var hasBarProperty = foo.hasOwnProperty("bar"); var isPrototypeOfBar = foo.isPrototypeOf(bar); var barIsEnumerable = foo.propertyIsEnumerable("bar");
正しいコードの例:
/*eslint no-prototype-builtins: "error"*/ var hasBarProperty = Object.prototype.hasOwnProperty.call(foo, "bar"); var isPrototypeOfBar = Object.prototype.isPrototypeOf.call(foo, bar); var barIsEnumerable = {}.propertyIsEnumerable.call(foo, "bar");