주어진 키의 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);
답변
특정 경우에 다음 예제가 작동합니다.
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
}
답변
이것도 작동하는 것 같습니다.
key in entries
키가 객체 내부에 있는지 여부에 대한 부울을 반환하기 때문에?
답변
나는 이것에 대해 비추천받지 않기를 바랍니다. 아마도 그렇게 될 것입니다.
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];
경우 키가 항목 에 없어도 코드가 표시됩니다 …)