for...in 반복문
for...in
반복문은 객체 자체에서 정의한 프로퍼티뿐만 아니라 상속 프로퍼티도 순회 대상에 포함. 반면, 키-값과 관련된 내장 메서드 대부분은 상속 프로퍼티는 제외하고 객체 자체 프로퍼티만을 대상으로 동작
let animal = {
eats: true
};
let rabbit = {
jumps: true,
__proto__: animal
};
alert(Object.keys(rabbit));
for(let prop in rabbit) alert(prop);
for(let prop in rabbit) {
let isOwn = rabbit.hasOwnProperty(prop);
if (isOwn) {
alert(`객체 자신의 프로퍼티: ${prop}`);
} else {
alert(`상속 프로퍼티: ${prop}`);
}
}
rabbit
은 animal
을, animal
은 Object.prototype
을, Object.prototype
은 null
을 상속
animal
이 Object.prototype
를 상속받는 이유는 객체 리터럴 방식으로 선언하였기 때문
Object.keys
, Object.values
같이 객체의 키-값을 대상으로 무언가를 하는 메서드 대부분은 상속 프로퍼티를 제외하고 동작