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. 김진홍
    감사합니다!
  2. 임지훈님의 정리댓글의 [ Object.메소드이름()이 Object자신만 쓸수 있다는것] 은,
    Object.keys(*객체*);
    이렇게 쓰는것을 말하는 것 아닐까요??
    대화보기
    • 박인호
      12-20
      수강완료.
      감사합니다. 함수(생성자)가 정의 될 때 그 함수의 프로토타입 객체라는 것이 함수와 함께 생성되고,
      어떤 객체의 __proto__라는 속성이 객체가 만들어 질 때 참조한 프로토타입객체를 링크한다
      라는 개념으로 접근하면 좀 더 쉽게 이해가 가는 것 같습니다.(저로서는요)
      저는 아래의 링크를 참조 했습니다.
      http://www.nextree.co.kr/p7323/
    • 고스트프리
      완료했습니다.
    • GoldPenguin
      완료했습니다.
    • 대화보기
      • 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 자세히 보기