본문 바로가기
Book/JavaScript

[모던 자바스크립트 Deep Dive] #16~17. 프로퍼티 어트리뷰트, 생성자 함수에 의한 객체 생성

by 이지이즤 2022. 3. 12.

 

▣ 16장: 프로퍼티 어트리뷰트
16.1 내부 슬롯과 내부 메서드
      내부 슬롯내부 메서드 : 이중 대괄호([[ ... ]])로 감싼 이름들. 직접적 접근이나 호출 불가능.

16.2 프로퍼티 어트리뷰트와 프로퍼티 디스크립터 객체
      프로퍼티 : 객체 내부의 속성을 의미. (프로퍼티란?)
      프로퍼티 상태 : 프로퍼티 값, 값의 갱신가능 여부, 열거 가능 여부, 재정의 가능 여부
      프로퍼티 어트리뷰트 : 내부슬롯 [[Value]], [[Writable]], [[Enumerable]], [[Configurable]].
                                   Object.getOwnPropertyDescriptor 메서드로 간접확인 가능.
      Object.getOwnPropertyDescriptor 메서드 : 프로퍼티 디스크립터 객체 반환.
      자바스크립트 엔진은 프로퍼티를 생성할 때,
      프로퍼티의 상태를 나타내는 프로퍼티 어트리뷰트를 기본값으로 자동 정의함.

16.3 데이터 프로퍼티와 접근자 프로퍼티
____16.3.1 데이터 프로퍼티
              데이터 프로퍼티 : 키와 값으로 구성된 일반적인 프로퍼티.
                                     [[Value]], [[Writable]], [[Enumerable]], [[Configurable]].

____16.3.2 접근자 프로퍼티
              접근자 프로퍼티 : 자체적으로 값을 갖지 않고 다른 데이터 프로퍼티의 값을 읽거나 저장할 때 호출되는
                                      접근자 함수로 구성된 프로퍼티.
                                      [[Get]], [[Set]], [[Enumerable]], [[Configurable]].

    // 일반 객체의 __proto__는 접근자 프로퍼티다.
    Object.getOwnPropertyDescriptor(Object.prototype, '__proto__');
    // {get: ƒ, set: ƒ, enumerable: false, configurable: true}

    // 함수 객체의 prototype은 데이터 프로퍼티다.
    Object.getOwnPropertyDescriptor(function() {}, 'prototype');
    // {value: {...}, writable: true, enumerable: false, configurable: false}


16.4 프로퍼티 정의
       프로퍼티 정의 : 새로운 프로퍼티를 추가하면서 프로퍼티 어트리뷰트를 명시적으로 정의하거나,
                            기존 프로퍼티와 프로퍼티 어트리뷰트를 재정의하는 것.
       프로퍼티 추가 : 프로퍼티 동적 추가 or Object.defineProperty 메서드로 추가

16.5 객체 변경 방지

____16.5.1 객체 확장 금지
             Object.preventExtensions 메서드 : 객체의 확장 금지. 확장이 금지된 객체는 프로퍼티 추가가 금지됨.
             Object.isExtensible 메서드 : 확장 가능한 객체인지 여부 확인. 
____16.5.2 객체 밀봉
             Object.seal 메서드 : 객체 밀봉. 프로퍼티 추가 및 삭제와 프로퍼티 어트리뷰트 재정의 금지.
                                       밀동된 객체는 읽기와 쓰기만 가능.
             Object.isSealed 메서드 : 밀봉된 객체인지 여부 확인. 
____16.5.3 객체 동결
             Object.freeze 메서드 : 객체 동결. 프로퍼티 추가 및 삭제와 프로퍼티 어트리뷰트 재정의 금지,
                                          프로퍼티 값 갱신 금지. 동결된 객체는 읽기만 가능.
                                          얕은 변경 방지임. 직속 프로퍼디만 변경 방지되고 중첩 객체는 동결 안됨. 
             Object.isFrozen 메서드 : 동결된 객체인지 여부 확인. 
____16.5.4 불변 객체
             객체의 중첩 객체까지 동결하여 변경이 불가능한 읽기 전용의 불변 객체를 구현하려면
             객체를 값으로 갖는 모든 프로퍼티에 대해 재귀적으로 Object.freeze 메서드를 호출해야 함.



▣ 17장: 생성자 함수에 의한 객체 생성
      객체 생성 방법 : 객체 리터럴 사용 또는 생성자 함수 사용.

17.1 Object 생성자 함수
      생성자 함수 : new 연산자와 함께 호출하여 객체(인스턴스)를 생성하는 함수.
      인스턴스 : 생성자 함수에 의해 생성된 객체.
      Object 생성자 함수 이외에도
      String, Number, Boolean, Function, Array, Date, RegExp, Promise 등의 빌트인 생성자 함수 제공함.

    // 빈 객체의 생성
    const person = new Object();

    // 프로퍼티 추가
    person.name = 'Lee';
    person.sayHello = function () {
      console.log('Hi! My name is ' + this.name);
    };

    console.log(person); // {name: "Lee", sayHello: ƒ}
    person.sayHello(); // Hi! My name is Lee


17.2 생성자 함수
____17.2.1 객체 리터럴에 의한 객체 생성 방식의 문제점
              프로퍼티 구조가 동일해도 매번 같은 프로퍼티와 메서드를 기술해야함.
____17.2.2 생성자 함수에 의한 객체 생성 방식의 장점
              생성자 함수를 사용하여 프로퍼티 구조가 동일한 객체 여러 개를 간편하게 생성할 수 있음.
____17.2.3 생성자 함수의 인스턴스 생성 과정
              인스턴스 생성과 this 바인딩 -> 인스턴스 초기화 -> 인스턴스 반환
              바인딩 : 식별자와 값을 연결하는 과정.
                         ex1) 변수 선언은 변수 이름(식별자)과 확보된 메모리 공간의 주소를 바인딩하는 것.
                         ex2) this 바인딩은 this(키워드이지만 식별자 역할)와 this가 가리킬 객체를 바인딩하는 것.
____17.2.4 내부 메서드 [[Call]]과 [[Construct]]
             일반 객체는 호출할 수 없지만 함수(객체)는  호출할 수 있음.
             -> 함수 객체는 일반 객체가 가지고 있는 내부 슬롯과 내부 메서드는 물론, 함수로서 동작하기 위해
                 함수 객체만을 위한 [[Environment]], [[FormalParamenters]] 등의 내부 슬롯과
                 [[Call]], [[Construct]] 같은 내부 메서드를 추가로 가지고 있음.
             함수 객체는 반드시 [[Call]]을 갖고있음. -> callable(호출할 수 있는 객체)
             함수 객체가 [[Construct]]를 가지면 constructor(생성자 함수로서 호출 가능), 아니면 non-constructor.
____17.2.5 constructor와 non-constructor의 구분
             함수 정의 방식에 따라 constructor와 non-constructor를 구분함.
             constructor : 함수 선언문, 함수 표현식, 클래스(클래스도 함수임)
             non-constructor : 메서드, 화살표 함수
____17.2.6 new 연산자
____17.2.7 new.target
              new 연산자와 함께 생성자 함수로서 호출되면 함수 내부의 new.target은 함수 자신을 가리킴.
              new 연산자 없이 일반 함수로서 호출된 함수 내부의 new.target은 undefined임.   

댓글