[자바스크립트] - Object

Sean yang~~·2022년 7월 11일
0

자바스크립트

목록 보기
16/25
post-thumbnail

Object

Object란?

  • 객체의 가장 기본적인 형태를 가지고 있는 객체
  • 아무것도 상속받지 않는 순수한 객체
  • 자바스크립트에서 값을 저장하는 기본적인 단위
  • 자바스크립트의 모든 객체는 Object객체를 상속받는다. 따라서 모든 객체는 Object 프로퍼티를 가지고 있다.
  • Object.prototype은 모든 객체가 사용할 수 있는 기능이다.
    - 모든 객체가 공통적으로 사용해야 할 기능이 있다면 Object.prototype에 기능을 추가함으로써 목적을 달성할 수 있다.

Object API 사용법

//Object.keys()
var arr = ["a", "b", "c"];
console.log('Object.keys(arr)', Object.keys(arr));

//Object.prototype.toString();
var o = new Object();
console.log('o.toString()', o.toString());

var a = new Array(1,2,3);
console.log('a.toString()', o.toString());

Object.메서드()

  • 사용법: Object.메서드()
    - 예시) Object.keys(arr)
    • 여기서 Object: 생성자 함수
  • 정의: Object.메서드명 = function(){}
    예시) Object.keys = function(){}

Object.prototype.메서드()

  • 모든 객체가 사용할 수 있는 메서드

  • 사용법: 객체식별자.메서드()
    예시) o.toString()

  • 정의:Object.prototype.메서드명 = function(){}
    -new Object() 명령어로 생성자를 호출하면 객체가 생성된다. 이떄 이 객체는 Object.prototype 속성에 저장되어 있는 객체를 원형으로 한다. 따라서 이 객체는 당연히 toString() 를 호출할 수 있다. 이떄 toSting()은 이 객체의 메서드로써 사용이 된다.

  • 그런데 Object는 모든 객체의 부모이다. 따라서 어떤 객체를 생성하든 Object.prototype에 정의되어 있는 메서드를 사용할 수 있다.

생성자 함수는 객체이니 속성을 가지고 있는데, 여기에 prototype이라는 특수한 속성이 있다. 이 prototype(원형)에 정의되어 있는 함수는 이 객체의 자식객체에서 사용할 수 있다. prototype에 정의되어 있지 않은 메서드는 자식객체에서 사용할 수 없다.

Object 확장의 위험성

  • Object 객체를 확장하면 모든 객체에 영향을 주기 떄문에 확장하지 않는 것이 바람직하다.
for(var name in o) {
    console.log(name);
}

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

// 결과
// name city contain
// 0 1 2 contain

// 확장한 프로퍼티 contain이 포함되어 있다. 
  • 객체가 기본적으로 가지고 있을 것으로 예상하고 있는 객체 외에 다른 객체를 가지고 있는 것은 개발자들에게 혼란을 준다.
  • 해결책: Object.prototype.hasOwnProperty() 메서드를 사용한다.
    - 프로퍼티의 해당 객체의 소속인지를 체크해 볼 수 있다.
    • 인자로 전달된 속성의 이름이 객체의 속성인지 여부를 판단한다.
    • 만약 prototype으로 상속 받은 객체라면 false가 된다.
for(var name in o)
    if (o.hasOwnProperty(name))
    	console.log(name);

for(var name in a)
    if (a.hasOwnProperty(name))
        console.log(name);

// 결과
// name city
// 0 1 2

// 확장한 프로퍼티 contain이 포함되지 않았다.
profile
나는 프론트엔드 개발자다!

0개의 댓글