JavaScript

[JavaScript] 객체 (Object)

FRDYtheme 2022. 12. 2. 17:57

객체 (Object)

함수, 배열, 정규 표현식 등 변형 가능한 데이터들의 집합

 

객체 종류

  • 코어 객체(Array, Math, Date, Number, String, ...)
  • DOM 객체
  • BOM 객체

 

기본 구조

{
	키(key): 값(value); <- 속성(property)
}
// key엔 문자형, value엔 모든 자료형(함수, 배열, 객체, 변수, 문자열, ...)이 허용

 


함수 표현식

 

const fn = function() {}

함수 표현식에는 함수 키워드가 들어간다.


객체 표현식(객체 리터럴 문법)

 

const obj = {}

let obj1 = {}; //빈 객체 생성.
  
console.log(typeof obj1); // object

객체 생성자 함수

  //new 생성자 함수 키워드를 이용. 객체 선언과 동시에 대입
  let obj2 = new Object(); // 빈 객체 생성

리터럴과 프로퍼티

객체 리터럴 안에는 { 키(key): 값(value) }로 구성된 프로퍼티가 포함되어 있으며개발자는 프로퍼티를 추가/제거 할 수 있다.

 

프로퍼티 키(key) : 프로퍼티 이름 or 프로퍼티 식별자라고도 부른다.

 

점(.) 표기법으로 프로퍼티 추가

let obj1 = {}; //빈 객체 선언.
  console.log(typeof obj1);
  
  obj1.coffee = '아메리카노'
  //obj1 리터럴 안에 아메리카노(값 value)를 가진 coffee(키 key)라는 프로퍼티를 추가

  console.log(obj1);
  //obj1에 포함된 프로퍼티 전부를 출력.


점(.)표기법으로 객체 리터럴 내 특정 프로퍼티 읽기

  let obj1 = {}; //빈 객체 선언.
  console.log(typeof obj1);
  console.log(obj1);

  obj1.coffee = '아메리카노'
  obj1.price = 4500;

  console.log(obj1);

  //프로퍼티 읽기
  console.log(obj1.coffee);
  //price:4500은 제외하고 coffee:아메리카노만 출력

함수도 프로퍼티로 들어갈 수 있다.

  let obj2 = new Object();
  obj2.coffee = "카페라떼";
  obj2.price = 5500;
  obj2.order = () => console.log(`주문하신 ${obj2.coffee} 나왔습니다.`);

  obj2.order();
  console.log(`총 ${obj2.price}원 입니다.`);

객체 내부에 있는 함수는 메서드(Method)라고 한다.


delete 키워드를 작성해 프로퍼티를 삭제할 수 있다.'delete 객체리터럴.프로퍼티식별자'

  console.log(obj2);
  delete obj2.price;
  console.log(obj2);

 


 

객체 특징

  • 키와 값에 인용 부호 작성 가능. 키는 생략 가능하나 값이 문자열인 경우 반드시 작성.
  • JS에서 식별자의 이름은 키워드와 같은 이름 작성을 권장하지 않으나 객체 안의 키 이름은 상관 없음
  • 객체 안에 프로퍼티로 작성된 함수는 method라고 함.
  • 프로퍼티 식별자(키) 이름은 띄어쓰기가 가능하나 인용 부호를 반드시 작성. 띄어쓰기가 있는 경우 점표기법으로 읽지 못 함.
  const menu = {
    "var": "변수", // 키 var는 변수의 키워드로 예약어지만 객체 내에서는 상관 없다.
    
    new: 1, // 키 let은 문자열이지만 ""를 작성하거나 생략해도 된다.
    
    string: "아메리카노", // 단, 값이 문자열인 경우 따옴표 필수로 작성.
    // 마지막 프로퍼티라도 뒤에 ,쉼표로 마무리해도 된다.
    
    boolean: true,
    
    array: [1,2,3,4],
    
    method: function() {},
    
    "한 글": "프로퍼티 식별자에 한글 사용 가능, 띄어쓰기도 가능하나 반드시 인용 부호 작성"
    // 띄어쓰기가 가능하지만 사용은 권장하지 않음.
  }

띄어쓰기가 있는 프로퍼티 식별자 불러오기

 

대괄호 [] 표기법

console.log(menu["한 글"]);
console.log(menu['method']);

전역 변수를 객체 내부의 프로퍼티에 복사하는 것이 가능하다.

<script>
  let name = "순이",
    age = 3,
    hobby = "냥냥펀치";

  var cat = {
    // 전역 변수에서 값을 가져와 객체에 적용 가능.
    name: name,
    age: age,
    hobby: hobby,
    특징: function () {
      console.log(`${cat.name}는 미친굉이입니다.`);
    },
  };
  console.log(cat);
  cat.특징();
</script>

 

단축 프로퍼티

  • 프로퍼티의 키와 값이 동일하다면 생략이 가능.
  • 함수의 function 키워드 생략 가능
  • this 키워드 : function 작성시 객체 내부를 지칭
  • 전역 변수를 객체 내부로 가져와 값 재할당 가능

 

<script>
  let name = "순이",
    age = 3,
    hobby = "냥냥펀치";

  var cat = {
    // 전역 변수에서 값을 가져와 객체에 적용 가능.
    name: name,
    age: age,
    hobby: hobby,
    특징: function () {
      console.log(`${cat.name}는 미친굉이입니다.`);
    },
  };
  console.log(cat);
  cat.특징();
  
  /* ------------------------------------------------ */

  let dog = {
    // 단축 프로퍼티
    name,
    age,
    hobby: '미사일펀치',
    특징 (food = '사료') { // function 키워드 생략 가능
      console.log(`${food}를 먹는 ${this.name}는 강아지`)
      // this 키워드.. function 작성시 객체 내부 지칭.
    }
  }

  console.log(dog);
  console.log(dog.hobby);
  dog.특징();
  dog.특징('개껌');
</script>


객체 내 프로퍼티 확인

'in' 연산자를 작성해 객체 내 프로퍼티의 유무를 확인.

 

'key' in 객체명;

true, false로 반환

<script>
  const obj = {
    id: 1,
    name: '객체',
    done: false,
    apple () { console.log(`객체 메서드`) }
  }

  console.log(obj);
  console.log(obj.id);

  console.log('id' in obj); // true
  console.log('name' in obj); // true
  console.log('age' in obj); // false
  console.log('apple' in obj); // true
</script>

for ... in

순회를 통해 객체의 키를 확인해서 배열로 반환.

 

for (key in 객체) {}
<script>
  const obj = {
    id: 1,
    name: "객체",
    done: false,
    apple() {
      console.log(`객체 메서드`);
    },
  };

  /* 
  순회를 통해 객체의 키를 확인해서 배열로 반환.
    for (key in 객체) {}
  */

  for (let i in obj) {
    console.log(`${i}`); // id, name, done, apple 로 키를 반환
    console.log(`${obj.i}`); // i라는 프로퍼티가 없기 때문에 undefined 4번 반환.
    console.log(`obj[i]: ${obj[i]}`); // 키와 값을 모두 반환
    // 1, 객체, false, f()
  }

</script>

객체 내 일반 함수와 화살표 함수의 this 키워드 차이점

 

일반 함수 : 객체 내부의 메소드에서 객체 자신(noName)을 가리키는 키워드.

화살표 함수 : 객체를 벗어나 window 객체를 인식함. 혹은 상황에 따라 다른 객체를 참조하기도 함.

<script>
  const noName = {
    // 일반 함수
    // this 키워드
    func: function() {
      console.log(this)
    },

    // 화살표 함수
    arrow : () => {
      console.log(this)
    }
  }
  
  noName.func();
  noName.arrow();
</script>

 


 

생성자 함수 객체 생성 방식의 규칙

  1. 함수의 첫 글자는 대문자로 시작
  2. 반드시 new 연산자를 붙여 실행

동일한 객체를 간단하게 여러 개 생성할 수 있으며 템플릿처럼 사용 가능.

  const num = new Number(10); //숫자 객체
  console.log(typeof num, num);
  const str = new String("1"); //문자 객체
  const bool = new Boolean(true); //불린 객체
  console.log(typeof str, str);
  console.log((str.add = "더하기"));
  console.log(str);
  console.log(typeof bool, bool);

  console.log(`----- 생성자함수 만들기 -----`);
  
  
  function Menu(name, price, size = 'tall') {
    this.name = name; // 객체의 프로퍼티 값은 생성자 함수의 매개변수 값을 받아온다.
    this.price = price;
    this.size = size;
    this.order = function () {
      console.log(
        `주문하신 커피는 ${this.name}이고 가격은 ${this.price}입니다.`
      );
    };
  }

let coffee = new Menu('아메리카노', 4000);
// 생성자 함수 Menu의 매개변수에 원하는 값을 대입해서 여러 객체를 만들어 활용할 수 있음.
console.log(`coffee: ${coffee}`);
// objec, object
console.log(coffee);
coffee.order();
coffee = new Menu('카페라떼', 5000);
coffee.order();


계산된 프로퍼티

객체를 만들 때 객체 리터럴 안의 프로퍼티 키를 [](대괄호)로 작성한 것.-> 이 경우 해당 프로퍼티는 프로퍼티 키를 동적으로 받아오게 된다.

[name]은 외부 변수 name의 값을 받아온다.
[]대괄호 표기법은 내부의 연산을 계산한다.


전역 객체

모든 객체의 유일한 최상위 객체를 의미

  • window 객체
    // 브라우저
    console.log(this === window);

  • global 객체(node.js 쪽)

 

전역 객체의 자식 객체를 사용할 때는 전역 객체인 window 생략 가능

    window.document.getElementById('id');
    
    //전역 객체의 자식 객체를 사용할 때는 전역 객체인 window 생략 가능
    document.getElementById('id');

 

'JavaScript' 카테고리의 다른 글

[JavaScript] String 메서드  (0) 2022.12.05
[JavaScript] JSON  (0) 2022.12.05
[JavaScript] 콜백 함수  (0) 2022.12.02
[JavaScript] 중첩 함수/ 내부 함수  (0) 2022.12.02
[JavaScript] 즉시 실행 함수  (0) 2022.12.02