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. 송유진
    Object.prototype.contain = function~~ 으로 지정한 속성이 왜 생성한 객체를 출력시킬 때 출력되나요? 이미 Object.prototype을 정의된 다른 속성들도 많은데 왜 직전에 정의한 contain만 하나 더 출력되는건지 궁금합니다. 제가 영상을 제대로 이해를 못한건지 ㅠㅠ흠..
  2. 스탐
    감사합니다.
  3. 정말
    감샤합니다
  4. 동아대학교
    명강의 감사합니다! 동아대화이팅!
  5. 민..직
    두번째 강의가 ㄹㅇ 명강의
  6. 피자
    마지막 동영상 5:11, for문 부분에 a.hasOwnProperty(name)의 name 이 객체 o 의 name을 가리키는 건지, 어떤 것을 가리키는 건지 헷갈릴 수도 있겠네요

    for(var name in a) 의 name을 다른 걸로 대입하셨으면 덜 헷갈렸을텐데

    물론, 제가 개념을 정확히 숙지하지 못한 것도 있겠죠
  7. 피자
    이고잉님 말씀대로 js를 배우면 배울수록 어렵네요
  8. 피자
    좋은 강의 잘 듣고있습니다~
    그런데 시스템 소리 최대로 높이고, 유튜브 볼륨 소리를 최대로 높여도 소리가 너무 작은데
    동영상자체의 소리가 좀 많이 작은 것 같아요~
  9. 옥슬이
    두번째꺼 넘 어렵네요 ㅠㅠ
    조금 더 쉽게 설명을 할 수 있을 것 같은데..
    좀 아쉽다고 해야하나.. 뭐 아닐 수도 있지만
  10. 감사합니다.
  11. 이재호
    그러게요... 저도 동일한 고민을 하고 있네요
    대화보기
    • 우니운
      재밌네요 ㅎㅎ 감사합니다
    • 서동화
      그럼 사전에 prototype 의 출력을 막아버리는 기능이 있을 것 같은데요. 왜냐면 다른 프로토타입들은 출력이 않되는 걸로 봐서... 뭔가 프로토타입도 속성을 정의내릴 수 있을 것 같다는 생각.
    • 코딩잘하고싶어요 ㅎ
      전체를 이해하려하지 말고 전체적인 흐름만 따라간다는 생각으로...*^^*
    • 김진홍
      감사합니다!
    • 임지훈님의 정리댓글의 [ Object.메소드이름()이 Object자신만 쓸수 있다는것] 은,
      Object.keys(*객체*);
      이렇게 쓰는것을 말하는 것 아닐까요??
      대화보기
      • 박인호
        12-20
        수강완료.
        감사합니다. 함수(생성자)가 정의 될 때 그 함수의 프로토타입 객체라는 것이 함수와 함께 생성되고,
        어떤 객체의 __proto__라는 속성이 객체가 만들어 질 때 참조한 프로토타입객체를 링크한다
        라는 개념으로 접근하면 좀 더 쉽게 이해가 가는 것 같습니다.(저로서는요)
        저는 아래의 링크를 참조 했습니다.
        http://www.nextree.co.kr/p7323/
      • 고스트프리
        완료했습니다.
      • GoldPenguin
        완료했습니다.
      • 대화보기
        • Seo Yun Seok Tudoistube
          만약, prototype 으로 상속받은 객체라면 false 가 된다.
          즉, 어떤객체.hasOwnProperty(속성) 을 하면 직접 소유한 속성인지 true, false 를 반환한다.
          감사합니다^_____^!!!
        • crable
          감사합니다.
        • BANIP
          전에 es6관련 도서에서 객체의 프로퍼티의 속성을 직접 정의하는 구문을 배웠었는데,
          그중에 열거 가능한 프로퍼티에 대한 속성을 여기에다 응용하면 되겠군요!
        • hyuna
          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
              현재 버전
              선택 버전
              graphittie 자세히 보기