계기

테스트 코드를 작성하다 버그를 발견했습니다.

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로 전달된 객체의 레퍼런스 값이기 때문에

이런식으로 '얕은 복사'를 하면서 프로퍼티 추가를 '금지'할 수 있습니다.

결론

본인을 믿기보다는 실수했을 때 가차없이 뺨따구를 걷어올려줄 감시자를 쓰는 것이 바람직 할 것 입니다.