JavaScript

Object

Object 객체는 객체의 가장 기본적인 형태를 가지고 있는 객체이다. 다시 말해서 아무것도 상속받지 않는 순수한 객체다. 자바스크립트에서는 값을 저장하는 기본적인 단위로 Object를 사용한다. 

var grades = {'egoing': 10, 'k8805': 6, 'sorialgi': 80};

동시에 자바스크립트의 모든 객체는 Object 객체를 상속 받는데, 그런 이유로 모든 객체는 Object 객체의 프로퍼티를 가지고 있다.

또한 Object 객체를 확장하면 모든 객체가 접근할 수 있는 API를 만들 수 있다. 아래는 Object 객체를 확장한 사례다.

Object.prototype.contain = function(neddle) {
    for(var name in this){
		if(this[name] === neddle){
			return true;
		}
	}
	return false;
}
var o = {'name':'egoing', 'city':'seoul'}
console.log(o.contain('egoing'));
var a = ['egoing','leezche','grapittie'];
console.log(a.contain('leezche'));

그런데 Object 객체는 확장하지 않는 것이 바람직하다. 왜냐하면 모든 객체에 영향을 주기 때문이다. 

확장 후에 아래 코드를 실행해보자.

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

결과

name
contain

확장한 프로퍼티인 contain이 포함되어 있다. 객체가 기본적으로 가지고 있을 것으로 예상하고 있는 객체 외에 다른 객체를 가지고 있는 것은 개발자들에게 혼란을 준다. 이 문제를 회피하기 위해서는 프로퍼티의 해당 객체의 소속인지를 체크해볼 수 있는 hasOwnProperty를 사용하면 된다. 

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

hasOwnProperty는 인자로 전달된 속성의 이름이 객체의 속성인지 여부를 판단한다. 만약 prototype으로 상속 받은 객체라면 false가 된다. 

댓글

댓글 본문
작성자
비밀번호
  1. GoldPenguin
    완료했습니다.
  2. 대화보기
    • Seo Yun Seok Tudoistube
      만약, prototype 으로 상속받은 객체라면 false 가 된다.
      즉, 어떤객체.hasOwnProperty(속성) 을 하면 직접 소유한 속성인지 true, false 를 반환한다.
      감사합니다^_____^!!!
    • crable
      감사합니다.
    • 전에 es6관련 도서에서 객체의 프로퍼티의 속성을 직접 정의하는 구문을 배웠었는데,
      그중에 열거 가능한 프로퍼티에 대한 속성을 여기에다 응용하면 되겠군요!
    • Object.메소드이름()이 Object자신만 쓸수 있다는게 무슨 말인지요.
      모든 객체는 Object의 메소드를 상속받지 않나요? prototype을 이용해서 새로운 메소드를 추가할수 있지만 그렇게 되면 모든 객체가 그 메소드도
      상속받기때문에 Object객체에는 추가하지 말라는 것 같은데요
      대화보기
      • 신입1
        감사합니다

        그런데 for in 문을 통해서 객체에 있는 요소들을 조회할 때, 사용자가 prototype에 추가한 프로퍼티는 조회가 되는데, 내장된 프로퍼티는 조회가 안되는 것인가요?
      • 만학의즐거움
        위의 needle을 찾는 프로그램을
        prototype.contain이 아닌 apply메소드를 이용해서 같은 결과를 나올수 있게 작성할수 있을까요?
      • 이런거 정말 좋습니다 ㅎㅎ
        듣다가 하 슬슬 3분전 말이 기억이 안나며 끝날때 쯤 보면 똥싸고 믿닦았는데 깨끗한 느낌.
        대화보기
        • 임지호
          Object : 모든 객체가 상속하는 조상 객체.
          - object가 가진 메소드는 두가지 형태가 있다. Object.메소드이름()과 Object.prototype.메소드이름()인데 첫 번째
          형태는 Object 자신만 쓸 수 있고 두 번째 형태는 모든 객체가 쓸 수 있는데 그 이유는 모든 객체가 Object를
          상속하기 때문이다.
          - 역으로 Object의 prototype을 이용해서 메소드를 만들면 모든 객체가 쓸 수 있는 강력한 메소드를 만들 수
          있지만 그만큼 위험해서 의도하지 않은 결과를 초래할 수 있기 때문에 되도록 권장하진 않는다.
        • 폭스킴
          hasOwnProperty, 결과값은 true or false
        • 완료!
          완료! 감사합니다.
        • hyuna
          2번째 동영상만 좀 더 쉽게 설명해주심 감사하겠습니다.
          코드도 첨부해주시면 더 감사하겠어요
        • 취준생1
          재밌습니다.
        • yihsang
          반복수강이 필요한 것 같습니다.
          감사합니다.
        • 구블리
          이번꺼는 계속 봐도 넘 어렵네요 ㅠㅠ
        • Freund
          유튜브 => JavaScript 입문 수업 (생활코딩)
          리스트에 Object 강의가 추가가 안되어 있네요.
        • fasdgoc
          Object 객체는 객체의 가장 기본적인 형태를 가지고 있는 객체이다. 다시 말해서 아무것도 상속받지 않는 순수한 객체다.
          어떻게 사용될 것인가를 먼저 설계한 후에 구현한다.
          기능을 볼 때 기능의 원리적인 것보다 기능이 어떻게 사용되고 어떤 취지의 기능인지 먼저 보고 기능이 어떻게 구현되었는지 본다.
        • 이주환
          2016. 04. 25
          잘보고 갑니다.
        • JustStudy
          고맙습니다
        • 국제표준규격
          Object.keys()는 클래스 매서드이고 toString은 Object클래스에서 객체를 통해 접근가능한 일반 매서드라고 이해하면 되죠. 일반언어와 너무 다른 방식으로 자바스크립트만의 '생성자'를 정의하다보니 설명이 애매모호해진 것 같습니다. 안타까운 마음에 적습니다.
        • 참고
          Object.모모는 Object라는 함수객체에 있는 메소드들이고
          Object.prototype.하하는 루트객체인 Object.prototype에 있는 메소드라서
          모든 객체가 다 상속하므로 바로 aObj.하하처럼 객체.하하의 형식으로 사용가능함.
          위의 것은 별도의 함수처럼 Object.모모(~)식으로 일반함수 쓰듯이 써야 됨.

          실제 스크립트상에서 Object라고 코딩시는 생성자 함수라는 걸 유념.
          객체를 생성하는 역할을 하는 생성자 함수객체이고(객체생성시 new Object(); 떠올리면 됨)
          거기에 쓸만한 메소드들을 멤버함수로 달아놨다는 식으로 생각하면 됨.

          개념설명시 근원이 되는 객체로 Object와 Object.prototype라는 걸 같이 혼용해서 쓰는데
          이때문에 많은 사람들이 실제 코드작성시에 Objcet라는 게 생성자 함수객체인데
          근원객체로 오인하면서 헷갈려함.
          정확히 근원객체, 모태객체의 의미로 사용하는 경우 Object.prototype라고 하는게 매우 정확하고 깔끔한 표현.
        • 5pecie1
          크롬에서
          window.Object.keys(obj) 는 에러없이 샐행되지만
          Object.window.keys(obj)는 에러가 나는걸 보면
          Object는 window를 상속받고 있는것 같습니다
          그러니깐 window가 최상위 객체인것 같습니다
        • akof
          제가 이해하기로는
          Object.keys와 같은 Object.~~는 Object 자기 자신의 메소드들이구요, 자기만이 쓰는 메소드들이고
          Object.prototype.~~은 모든 객체가 쓸 수 있는 메소드들이라는 것 같네요.
          prototype은 prototype.~~을 그니까 prototype의 메소드들을 상속하니깐요.
          제가 제대로 이해한 것인지.ㅋㅋㅋ;
        • Part Hyun
          3번들어도 이해가 안되내요ㅠ ㅠ 10번쯤 반복해봐야겠네요 ㅋㅋ
        • summerholic
          단순히 이해하면,
          Object.prototype.name() 으로 선언된 메서드는 모든 객체에서 사용가능한 프로토타입이기 때문에
          o.String() 처럼 사용하면 되는 것이네요. (key()같은 경우는 그렇지 않기 때문에 Object.keys(o) 처럼 사용해야 하는 것이구요.)
          이 시점에 궁굼한 것은 그럼, Object와 Window의 관계는 어떻게 되는지요?
        • 찐똥구리구리
          그러게요~ 별도로 생성자 없이도 Object. prototype 메소드를 사용할 수 있는게 재밌네요. 3번째 예제에서는 생성자 호출 없이 바로 사용하시네요.

          이고잉님~ 감사합니다~
          대화보기
          • chan
            강의 2편에서 왜 array를 사용할때 new를 사용하나요?
            강사님이 말씀하시기를 new를 사용하는이유로 object에 속성을 받아서 toString을 사용한다는데,
            제가 실행결과 new를 사용안해도 toString을 사용할수있는데..
          • sssssqew
            앞선 강의에서 window 도 모든 객체의 부모 객체라고 설명하신거 같은데 그러면 window나 object 는
            window.prototype으로 함수를 정의하면 어떻게 되나요?
          • framei
            감사합니다.
          • 조신부리
            감사합니다
          • Sirhc
            사소한건데 스펠링이 오타가 났어요

            neddle --> needle(바늘) (__);
          • egoing
            없을 것 같아요. 있으면 알려주세요^^
            대화보기
            • 샤핀
              다른 언어와 연관된 의문이 떠올라서 드리는 질문인데요.
              자바의 경우에도 최상위 클래스가 object인데 자바스크립트와 같이
              java에서도 혹시 object클래스에 메소드를 확장시키는 방법이 있을려나요?
            • 나무마루
              의문이 좀 풀리네요.
            버전 관리
            egoing
            현재 버전
            선택 버전
            graphittie 자세히 보기