생활코딩

Coding Everybody

코스 전체목록

닫기

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 자세히 보기