← Back to NOTES 🌰
← Effective JavaScript 🤿
← 아이템 46 - 순서가 정해진 컬렉션에는 딕셔너리 대신 배열을 사용하라
핵심 요약
Object.prototype에 열거 가능한 프로퍼티를 추가하면 모든 객체의 for...in 루프에서 그 프로퍼티가 나타나서 예상치 못한 동작을 일으킨다. 프로토타입 확장이 필요하다면 Object.defineProperty()를 사용하여 enumerable: false로 설정하거나, 아예 프로토타입 확장을 피하고 별도의 함수나 유틸리티 객체를 사용하라. 프로토타입 오염은 전역적인 영향을 미치므로 특히 주의해야 한다.
자세한 내용
프로토타입 오염의 문제점
- 전역 영향:
Object.prototype 수정이 모든 객체에 파급
- for...in 오염: 모든 객체의 열거에서 추가된 프로퍼티 노출
- 예측 불가능성: 기존 코드의 동작 변경
- 라이브러리 충돌: 여러 라이브러리가 같은 이름으로 확장 시 충돌
Object.defineProperty의 활용
- enumerable 제어: 열거 가능성을 세밀하게 제어
- writable 제어: 프로퍼티 수정 가능성 제어
- configurable 제어: 프로퍼티 삭제 및 재정의 가능성 제어
- getter/setter: 접근자 프로퍼티로 동적 동작 구현
안전한 대안
- 유틸리티 함수: 전역 함수나 별도 네임스페이스
- 별도 객체: 확장 기능을 담은 독립적인 객체
- mixin 패턴: 필요한 객체에만 선택적으로 기능 추가