객체지향 Object

Joy·2022년 10월 24일
0

JavaScript

목록 보기
13/15

Object

Object는 객체의 가장 기본적인 형태를 가지고 있는 객체(아무것도 상속받지 않은 순수한 객체)이다.
자바스크립트에서는 값을 저장하는 기본적인 단위로 Object를 사용한다.
자바스크립트의 모든 객체는 Object를 부모로 한다.(Object를 상속 받음)
즉, 모든 객체는 Object의 prototype을 상속 받는다.
따라서 모든 객체들에 공통으로 기능을 추가 하고 싶다면 Object의prototype프로퍼티에 해당 기능을 추가하면 된다.
이렇게 활용하면 Object의 prototype을 이용해 모든객체가 사용할 수 있는 메소드를 만들 수 있다는 말과 같다.

Object API(Object가 가진 메소드)

Object API사용법 중 keys()와 toString()에 대해 알아보자

Object.keys();

어떤 객체가 있을 때 객체가 가지고 있는 여러가지 키 값들을 리턴해주는 메소드

	//Object.keys();
    let person = {'name':'Oh', 'age':'25', 'city':'seoul'};
    console.log(Object.keys(person)); //['name', 'age', 'city']

Object.prototype.toString();

어떤 객체가 있을 때 그 객체가 담고 있는 어떤 값들이 무엇인가, 또는 그 객체의 상태를 사람이 보기 좋게 문자열로 출력 해주는 메소드이다.

	//Object.prototype.toString();
    let arr = new Array(1,2,3);
    console.log(arr.toString()); // 1,2,3
    => 객체는 암시적으로 Object라는 부모 객체를 갖고 있다.
    	따라서 Object에 정의되어 있는 toString과 같은 메소드를 사용할 수 있는 것이다.

=>
Object.keys();는 결국 Object.keys = function(){}과 같으며 여기서 Object는 생성자 함수일 것이다.
하지만 Object.prototype.toString();은 Object.prototype.toString = function(){}이라는 뜻으로 프로토타입이라는 프로퍼티에 저장되어 있는 객체를 유전자로 가진 객체가 생성되는 것이다.
즉 쉽게 말해 Object는 모든 객체의 부모이고 중간에 prototype이 들어간 API는 모든객체에서 상속하여 사용할 수 있다는 것이며 이 말은 곧 우리가 만드는 애플리케이션에서 모든 객체가 공통적으로 가져야 하는 기능이 있다면 위 기능을 통해 수정하고 만들 수 있다는 뜻이다.

Object 확장

Object API의 상속을 이용하여 우리가 필요한 Object 객체를 확장한 기능을 구현 할 수 있다.
객체의 값 중 내가 입력한 값이 있다면 true, 없다면 false를 리턴해주는 예제

	Object.prototype.contain = function(value){ //체크하려는 값 이름
    	for(var name in this){ //하나하나 값을 찾기 위해 for in문 사용
        	if(this[name] === value){
            	return true;
           }
       }
       return false;
   }
   var o = {'name':'Oh', 'city':'Seoul'}
   console.log(o.contain('Oh')); // true
   var a = ['Oh','admin','root'];
   console.log(a.contain('Seoul')); // false

이렇게 Object API 상속을 이용하여 모든 객체가 사용하는 메소드를 만들 수 있지만
Object객체는 확장하지 않는 것이 바람직하다.
왜냐하면 모든 객체에 영향을 주기 때문이다.
확장한 코드에 아래 코드를 실행해보자

	for(var name in o){
    	console.log(name);
    }

o라는 변수에 내가 넣은 키 값은 name,city두가지 인데 결과는 name,city,contain이 나온다.
즉,프로토타입에 추가한 메소드가 함께 출력된다.

이런 혼란을 피하기 위한 방안으로 해당 객체의 소속인지를 체크할 수 있는 hasOwnProperty()를 사용하여 인자로 전달된 속성의 이름이 해당 객체의 속성인지의 여부를 판단한다.
만약 prototpye으로 상속 받은 객체라면 false

profile
🐣

0개의 댓글