테스트 코드를 작성하다 버그를 발견했습니다.
const testUser = { userName: 'Greg', age: 18 }
/*......
......
.skip.
......
......*/
let newUser = { ...testUser }
newUser.username = '김커피'
코드를 재사용하려고 testUser를 복사한 뒤에 필요한 프로퍼티만 수정해서 사용하고 있었는데요.
console.log(newUser)
// { userName: 'Greg', age: 18, username: '김커피' }
이미 눈치채신 분도 있겠지만 userName, username 두 개의 프로퍼티가 생겨버렸습니다
진작 확인해서 다행이라는 생각보다는 공포감이 몰려오더라구요 허허...
"앞으로는 조심해야지! ㅎㅎㅎ" 보다는 이런 실수가 다시 생겨도 막아줄 안전장치를 마련하는게 좋은 자세일 겁니다.
구글링을 해보니 Object.preventExtensions()
라는 게 있더라구요.
const obj = { a: 'aaa' }
Object.preventExtensions(obj)
obj.a = 'AAA'
obj.b = 'bbb'
console.log(obj)
// { a: 'AAA' }
기존에 있던 프로퍼티 a 는 수정되었지만 b는 추가되지 않았습니다.
'use strict'
const obj = { a: 'aaa' }
Object.preventExtensions(obj)
obj.b = 'bbb'
// TypeError: Cannot add property b, object is not extensible
엄격 모드를 사용하면 가차없이 에러가 발생합니다.
const copyAndFreeze = function(obj) {
return Object.preventExtensions({ ...obj })
}
Object.preventExtensions()
의 리턴값은 paramater로 전달된 객체의 레퍼런스 값이기 때문에
이런식으로 '얕은 복사'를 하면서 프로퍼티 추가를 '금지'할 수 있습니다.
본인을 믿기보다는 실수했을 때 가차없이 뺨따구를 걷어올려줄 감시자를 쓰는 것이 바람직 할 것 입니다.