Object.keys()
이 열거 지정된 객체의 자신의 열거 속성의 배열을 (반환 단지 즉, 당신은 객체를 통해 누구 열거 재산 true
로 설정 한 경우에만 해당 속성을 반복하려고하는 경우 반복됩니다 - Object.getOwnPropertyDescriptor
참조).
이것은 ip
속성이 request
객체로하고 request
객체가 프로토 타입 체인에 어딘가에 ip
속성을 상속하는 것을 소유하지 않은 것을 의미 할 수있다.
실제적인 경우임을 입증하려면 Object.getPrototypeOf()
메서드를 사용할 수 있습니다.
처음에는 단순히 Object.getPrototypeOf(req)
을 시도했지만 반환 된 객체에 ip
속성을 찾지 못했습니다. 그래서 나는 프로토 타입 체인을 더 깊이 파고 들었다. ip
주소 속성은 프로토 타입 체인에서 상속되기 때문에
console.log(Object.getPrototypeOf(Object.getPrototypeOf(req)));
이 Object.keys()
이의 속성으로 ip
을 나열하지 않습니다, 속성 앞서 언급 한 바와 같이
IncomingMessage {
...
acceptsEncodings: [Function]
ip: [Getter],
ips: [Getter],
...
}
으로 IP와 객체를 반환 req
개체.
또한 JS : Getters에서 사용할 수있는 또 다른 멋진 기능, 즉 계산 된 속성 값을 강조 표시합니다.
은 때로는 동적으로 계산 된 값을 반환하는 재산에 대한 액세스를 허용하는 것이 바람직하다, 또는 호출 명시 적 방법의 사용을 요구하지 않고 내부 변수의 상태를 반영 할 수 있습니다. MDN에서 Getters에 대해 읽어보십시오.
여기 정확히 무슨 일이 일어 났습니까? Express에는 http 요청의 페이로드에서 IP 주소를 추출하기위한 내부 논리가 있으며 IP 주소에 액세스하는 대신 req.ip()
, Express 개발자는 ip
속성에 액세스 할 때 호출되는 함수를 바인딩하도록 선택했습니다. ip
속성을 사용하면 req.ip
을 통해 IP 주소에 액세스 할 수 있습니다.
['Object.keys'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys) 개체의 배열을 반환 ** 자신의 열거 가능 * * 속성. 그래서'ip'가 프로토 타입 체인 (** 소유하지 않음 **)에 있거나 ** enumerable ** 속성으로 표시되어 있으면 나열되지 않습니다. –
.. 같은 일이 배열에서 발생합니다 :'Object.keys (someArray);'는'length' 속성을 포함하지 않을 것입니다. –
그것은 'enumerable : true'로 표시되고 자체 속성으로 설정되어있는 것으로 보입니다. –