티스토리 뷰
hasOwnProperty등 builtin 메소드 안전하게 사용하기
문제 상황
eslint 세팅 작업을 하다가 hasOwnProperty 메소드에 빨간 줄이 가는 걸 보았다.
no-prototype-builtins 라는 eslint 규칙인데, 이는 Object.prototype
의 builtin으로 제공되는 메서드를 객체에서 직접 호출하기 않도록 하는 규칙이다.
// bad
if (result.data.hasOwnProperty('error')) {
alert(result.data.error.msg);
}
// good
if (Object.prototype.hasOwnProperty.call(result.data, 'error')) {
alert(result.data.error.msg);
}
위와 같이 객체에 직접 메소드를 사용하지 않고 Object.prototype.hasOwnProperty.call
등을 사용하는 이유는 다음과 같다.
1. Object.create(null)
Object.create()
메소드에 null을 인자로 주어 객체를 생성하게 되면 Object.prototype
을 상속받지 않게 된다.
위와 같이 만들어진 객체에 builtin 메소드를 직접 호출하게 되면 에러가 발생한다.
const obj = Object.create(null);
obj.name = 'simyeong';
obj.hasOwnProperty; // undefined
obj.hasOwnProperty('name'); // Uncaught TypeError
Object.prototype.hasOwnProperty.call(obj, 'name'); // true
2. 속성이 builtin 메소드의 이름과 같은 경우
누군가 실수, 혹은 악의적으로 builtin 메소드와 같은 이름의 속성을 객체에 포함시키는 경우, 예상치 못한 동작이 발생할 수 있다.
const badObj = {
hasOwnProperty: '1',
name: 'simyeong'
}
badObj.hasOwnProperty('name'); // Uncaught TypeError
Object.prototype.hasOwnProperty.call(badObj, 'name'); // true
결론
hasOwnProperty()
등 Object builtin 메소드를 사용할 때는 객체에 직접 호출하지 말고 Object.prototype
을 이용하자.
'Programming > Javascript' 카테고리의 다른 글
?? 연산자 (null 병합 연산자, Nullish coalescing operator) (0) | 2021.01.07 |
---|---|
String.prototype.padStart()와 String.prototype.padEnd() (0) | 2021.01.07 |
clientHeight, offsetHeight, scrollHeight의 차이 (0) | 2020.12.18 |
자바스크립트로 페이지 새로고침하기 (0) | 2020.12.09 |
parameter와 argument의 차이 (0) | 2020.05.31 |
댓글