
JS 에서 in 연산자를 이용하면 객체 내에 프로퍼티가 있는지 확인 할 수 있다.
프로퍼티 in 찾는 객체
간단하게 in 연산자를 이용해 존재여부를 확인할 수 있지만,
문제는 내가 찾는 객체를 넘어 Object 있는 프로퍼티까지도 확인이 된다는 점이다.
let user = {
name : "herry",
age : 19,
action : function () {
return ("윙가르디움 레비오사")
}}
"age" in user // true
"toString" in user // true
위의 예시 처럼 user 라는 객체에 "toString" 프로퍼티는 없는데(!) true가 나온다.
이는 위에 언급한 것 처럼 Object의 프로토타입에 toString을 상속 받았기 때문이다.
그렇기때문에 정확하게 확인을 하기위해서는 in 연산자가 아닌 다른방법을 찾아야하는데
그게 바로 hasOwnProperty() 이다.
hasOwnProperty() 메소드는 객체가 특정 프로퍼티를 가지고 있는지를 나타내는 불리언 값을 반환한다. - mdn참고
user.hasOwnProperty("age") //true
user.hasOwnProperty("toString") //false
hasOwnProperty() 를 사용하면 이처럼 정확하게 프로퍼티 확인이 가능하다.
하지만..
여기에도 문제가 존재한다.
JS는 매우 유연한 언어이기 때문에 내부적으로 인스턴스 메스드를 보호해주지 않는다.
이말인 즉슨, 내가 hasOwnProperty() 라는 메서드를 만들수도 있다는 거..
let user = {
name : "herry",
age : 19,
hasOwnProperty: function () {
return ("윙가르디움 레비오사")
}}
user.hasOwnProperty("age") // "윙가르디움 레비오사"
ㅎ.. 이런식으로 전역이 오염되어 기존의 hasOwnProperty() 의 능력을 쓸 수가 없어진다..
그렇다면 찐 안전하게 사용하려면 어떻게 해야할까?
Object.prototype.hasOwnProperty.call(user,'age') //true
Object.prototype.hasOwnProperty.call(user,"toString") //false
hasOwnProperty를 Object의 portotype에 접근해서 사용하면 된다!
call 함수는 뒤에 다시 정리를.. 총총