[javascript] 다음 논리에서 Object.prototype 메서드에 어떻게 액세스합니까?

주어진 키의 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.prototypehasOwnProperty방법은 뭔가에 의해 그림자가 될 수있다.

물론 위의 코드는

  • 글로벌 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];경우 키가 항목 에 없어도 코드가 표시됩니다 …)


답변