次のロジックを使用して、指定されたキーの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」エラーです。
このエラーを解決するためにコードを変更するにはどうすればよいですか?このルールを無効にしたくありません。
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);
これもうまくいくようです:
key in entries
キーがオブジェクト内に存在するかどうかについてブール値を返すので?
特定のケースでは、次の例が機能します。
if(Object.prototype.hasOwnProperty.call(entries, "key")) {
//rest of the code
}
OR
if(Object.prototype.isPrototypeOf.call(entries, key)) {
//rest of the code
}
OR
if({}.propertyIsEnumerable.call(entries, "key")) {
//rest of the code
}