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


91

주어진 키의 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 '오류입니다.

이 오류를 해결하려면 코드를 어떻게 변경합니까? 이 규칙을 비활성화하고 싶지 않습니다.


9
아마도 문서를 읽어야 할 것입니다. 올바른 코드의 예가 있습니다 ~ eslint.org/docs/rules/no-prototype-builtins
Phil

1
사용을 제안 Object.hasOwnProperty(entries,key)하시겠습니까?
열정

코드가 잘 작동합니다. 이것은 Linting 오류입니다. linting 규칙이 충족되도록 구문을 수정하고 싶습니다.
booYah

1
@passion 문자열 화 entries하고 무시 하고 해당 문자열의 속성이 key있는지 확인 Object합니다.
Oriol

답변:


149

다음을 통해 액세스 할 수 있습니다 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);

14

특정 경우에 다음 예제가 작동합니다.

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
}

11

이것도 작동하는 것 같습니다.

key in entries

키가 객체 내부에 있는지 여부에 대한 부울을 반환하기 때문에?


3
hasOwnProperty문자열 또는 기호가 고유 한 속성인지 확인합니다. key in entries자신의 것인지 또는 상속 된 것인지 확인합니다.
Oriol

0

나는 이것에 대해 비추천받지 않기를 바랍니다. 아마도 그렇게 될 것입니다.

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


1
a가지고있는 프로토 타입 이 있다면 문제가 c발생할 것입니다. Js는 프로토 타입 체인으로 올라갈 것입니다
Bernardo Dal Corno
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.