몽탁이의 개발일기
Object 객체 본문
자바스크립트에서는 Object라는 객체가 존재합니다.
이 객체는 자바스크립트의 모든 객체의 부모 객체가 됩니다.
그래서 모든 객체는 Object의 메소드를 상속받아 사용할 수 있습니다.
var arr = ['a','b','c'];
console.log('Object.keys(arr)',Object.keys(arr));
var o = new Object();
console.log('o.toString()',o.toString());
var a = new Array(1,2,3);
console.log('a.toString()',a.toString());
위 예제처럼 new Object를 하지 않은 변수 a도 Object의 메소드인 toString()을 사용할 수 있습니다.
하지만 주의할 점이 한 가지 있습니다. 객체가 Object 객체가 가지고 있는 모든 메소드를 사용할 수 있는 건 아닙니다.
맨 위의 key라는 메소드는 생성자로 만든 객체들이 사용할 수 없습니다. 그 이유는 자바스크립트에서 상속을 내릴 때
Obejct 객체 안에 prototype이라는 프로퍼티에 담겨있는 객체를 상속하기 때문입니다.
즉, Object.keys라는 것은
Object.keys = function() {} 이런 식으로 정의가 되어있고
toString메소드는
Object.prototype.toString = function(){} 라고 정의되어 있습니다.
그렇기 때문에 모든 객체가 상속받는 Object객체는 Object 안에 prototype 프로퍼티가 가지고 있는 객체를 상속을 내리기 때문에 prototype 프로퍼티 안에 정의된 메서드만 사용이 가능한 것입니다.
그럼 모든 객체가 사용하는 메소드를 추가적으로 사용자가 정의할 수 있는가?라는 생각이 들게 됩니다.
그의 대한 답은 가능은 합니다. 하지만 큰 위험성이 있습니다.
Object.prototype.contain = function(needle){
for(var name in this){
if(this[name] === needle){
return true;
}
}
return false;
}
var o = {'name':'egoing','city':'seoul'};
console.log(o.contain('grapittie')); // 인자로 넣어준 값이 존재하면 true 없으면 false
var a = ['egoing','leezche','grapittie'];
console.log(a.contain('leezche'));
위 예제를 보면 Object.prototype 에 직접 contain함수를 정의합니다. 그리고 객체를 만들어 정의한 메소드를
실행해보면 작동이 잘 됩니다.
하지만 위 예제를 실행 후 o객체의 키 값들을 출력하게 되면
for(var name in o){
console.log(name);
}
결과)
name
city
contain
이런 결과가 나옵니다. 즉 o객체가 가지고 있는 사용자가 정의한 프로퍼티를 모두 반환하게 됩니다.
그리고 Object에 직접 선언했기 때문에 모든 객체가 contain이라는 프로퍼티를 반환하게 됩니다. 모든 객체에
영향을 주기 때문에 Object에 직접 선언하는 것은 매우 위험한 일입니다.
이런 상황을 막아주는 방법도 있기는 합니다.
for(var name in o){
if(o.hasOwnProperty(name) === true);
console.log(name);
}
hasOwnProperty는 Object 객체 가지고 있는 메소드입니다. 이 메소드는 인자로 넘긴 값이 누구의 프로퍼티인가를
확인하여 맨 앞의 o가 가진 프로퍼티이면 true를 반환하고 아니면 false반환합니다.
이 메소드를 활용하여 o가 가진 프로퍼티만 골라낼 수 있지만 되도록이면 정말 필요한 상황에서만 Object에
직접 정의하는 것이 좋습니다.
'Javascript 정리' 카테고리의 다른 글
Javascript의 데이터 타입 (0) | 2020.07.20 |
---|---|
Wrapper 객체 (0) | 2020.07.02 |
표준 내장 객체 (0) | 2020.07.02 |
prototype (0) | 2020.07.01 |
상속 (0) | 2020.07.01 |