[js] spread operator 에 의해 열거되지 않는 속성이 있다?
May 31, 2019 - [js]
ES6에서 도입된 spread operator 는 객체를 다룰 때 상당히 유용하게 쓰인다. 하지만 정확히 알고 사용하지 않으면 오류를 발생시킬 수 있다.
특별히 프레임웍으로부터 전달받은 이벤트객체를 spread operator 를 이용해 전개할 경우 속성 전개가 안 되는 경우가 있을 수 있다. 예시를 통해 구체적인 차이점을 이해한다.
아래와 같이 객체 상속을 정의한 경우에는 date가 출력된다.
class Event {
date = Date.now()
}
class ClickEvent extends Event {
constructor(x,y){
super()
this.x = x
this.y = y
}
}
const event = new ClickEvent(100, 200)
console.log(JSON.stringify({...event}))
결과)
{"date":1559273437090,"x":100,"y":200}
하지만 아래와 같이 상속을 정의한 경우에는 date가 출력되지 않는다
function Event() {
this.date = Date.now()
}
function ClickEvent(x, y) {
this.x = x
this.y = y
}
ClickEvent.prototype = new Event()
const event = new ClickEvent(100, 200)
console.log(JSON.stringify({...event}))
결과)
{"x":100,"y":200}
차이점을 눈치 챘는가?
결론
spread operator 는 객체 자신이 소유한 속성만 열거 가능하며 상속받은 속성은 열거되지 않는다는 것을 꼭 기억하자
기타
객체 소유의 속성만 접근하는 것
Object.keys
,Object.assign
상속받은 속성까지 나열 하는 것
for ~ in