딥다이브 day4 (16 ~ 18)

kdev·2022년 7월 11일
0
post-thumbnail

16장 (프로퍼티 어트리뷰트)

  • 내부 슬롯과 내부 메서드는 자바스크립트 엔진의 구현 알고리즘을 설명하기 위해 ECMAScript 사양에서 사용하는 의사 프로퍼티와 의사 메서드이다.

  • 내부 슬롯과 내부 메서드는 ECMAScript 사양에 정의된 대로 구현되어 자바스크립트 엔진에서 실제로 동작하지만 개발자가 직접 접근할 수 있도록 외부로 공개된 객체의 프로퍼티는 아니다.
    - 단, 일부 슬롯과 내부 메서드에 한하여 간접적으로 접근할 수 있는 수단을 제공하기는 한다.
    - 예를 들어, 모든 객체는 [[Prototype]] 이라는 내부 슬롯을 갖고, 자바스크립트 엔진의 내부로직이므로 원칙적으로 직접 접근할 수 없지만 [[Prototype]] 내부 슬롯의 경우, _ proto _를 통해 간접적으로 접근할 수 있다.

  • 프로퍼티 어트리뷰트와 프로퍼티 디스크립터 객체
    - 자바스크립트 엔진은 프로퍼티를 생성할 때 프로퍼티의 상태를 나타내는 프로퍼티 어트리뷰트를 기본값으로 자동 정의한다.
    - 프로퍼티의 상태란, 프로퍼티의 값, 값의 갱신 가능 여부, 열거 가능 여부, 재정의 가능 여부를 말한다.
    - 프로퍼티 어트리뷰트는 자바스크립트 엔진이 관리하는 내부 상태 값인 내부슬록 [[Value]] [[Writable]] [[Enumerable]] [[Configurable]] 이다.
    - 프포퍼티 어트리뷰트에 직접 접근할 수 없지만, object.getOwnPropertyDescriptor 메서드를 사용하여 간접적으로 확인할 수는 있다. 이 메서드는 프로퍼티 디스크립터 객체를 반환한다.
    - 프로퍼티는 데이터 프로퍼티와 접근자 프로퍼티로 구분할 수 있다.
    - 데이터 프로퍼티: 키와 값으로 구성된 일반적인 프로퍼티.지금까지 살펴본 모든 프로퍼티는 데이터 프로퍼티다.
    - 접근자 프로퍼티: 자체적으로는 값을 갖지 않고 다른 데이터 프로퍼티의 값을 읽거나 저장할 때 호출되는 접근자 함수로 구성된 프로퍼티.
    - 데이터 프로퍼티: 프로퍼티 어트리뷰트는 자바스크립트 엔진이 프로퍼티를 생성할 때 기본값으로 자동 정의된다.

    - 접근자 프로퍼티: 자체적으로는 값을 갖지 않고 다른 데이터 프로퍼티의 값을 읽거나 저장할 때 사용하는 접근자 함수로 구성된 프로퍼티


- 접근자 함수는 getter/setter 함수라고도 부른다. 접근자 프로퍼티는 getter와 setter 함수를 모두 정의할 수 있고, 하나만 정의할 수도 있다.


- [[Get]] 내부 메서드의 동작 방식


- 프로토타입
- 프로토타입은 어떤 객체의 상위 객체의 역할을 하는 객체이다. 프로토타입은 하위 객체에게 자신의 프로퍼티와 메서드를 상속한다. 프로토타입 객체의 프로터피나 메서드를 상속받은 하위 객체는 자신의 프로퍼티 또는 메서드인 것처럼 자유롭게 사용할 수 있다.
- 프로토타입 체인은 프로토타입이 단방향 링크드 리스트 형태로 연결되어 있는 상속 구조를 말한다. 객체의 프로퍼티나 메서드에 접근하려고 할 때 해당 객체에 접근하려는 프로퍼티 또는 메서드가 없다면 프로토타입 체인을 따라 프로토타입의 프로퍼티나 메서드를 차례대로 검색한다.
- 접근자 프로퍼티와 데이터 프로퍼티를 구별하는 방법

  • 프로퍼티 정의
    - 새로운 프로퍼티를 추가하면서 프로퍼티 어트리뷰트를 명시적으로 정의하거나, 기존 프로퍼티의 프로퍼티 어트리뷰트를 재정의하는 것
    - object.defineProperty 메서드로 프로퍼티를 정의할 때 프로퍼티 디스크립터 객체의 프로퍼티를 일부 생략할 수 있다. 프로퍼티 디스크립터 객체에서 생략된 어트리뷰트는 아래와 같이 기본 값이 적용된다.

    - Object.defineProperty 메서드는 한번에 하나의 프로퍼티만 정의할 수 있다.
    - Object.defindeProperties 메서드를 사용하면 여러 개의 프로퍼티를 한번에 정의할 수 있다.
  • 객체 변경 방지
    - 객체는 변경 가능한 값으로 재할당 없이 직접 변경할 수 있다.
    - 따라서 Object.defineProperty 나 Object.defineProperties 메서드를 사용하여 프로퍼티 어트리뷰트를 재정의할 수도 있다.
    - 자바스크립트는 객체의 변경을 방지하는 다양한 메서드를 제공한다. 객체 변경 방지 메서드들은 객체의 변경을 금지하는 강도가 다르다.

    - 객체 확장 금지: 확장이 금지된 객체는 프로퍼티 추가가 금지된다. 확장 가능 여부는 Object.isExtensible 메서드로 확인할 수 있다.
    - 객체 밀봉: 밀봉된 객체는 읽기와 쓰기만 가능하다. 밀봉 여부는 Object.isSealed 메서드로 확인할 수 있다.
    - 객체 동결: 동결된 객체는 읽기만 가능하다. 동결 여부는 Object.isFrozen 메서드로 확인할 수 있다.
    - 불변 객체: 객체의 중첩 객체까지 동결하여 변경이 불가능한 읽기 전용의 불변 객체를 구현하려면 객체를 값으로 갖는 모든 프로퍼티에 대해 재귀적으로 Object.freeze 메서드를 호출해야 한다.

17장(생성자 함수에 의한 객체 생성)

  • Object 생성자 함수
    - new 연산자와 함께 Object 생성자 함수를 호출하면 빈 객체를 생성하여 반환한다. 빈 객체를 생성한 이후 프로퍼티 또는 메서드를 추가하여 객체를 완성할 수 있다.
    - 생성자 함수란 new 연산자와 함께 호출하여 객체를 생성하는 함수를 말한다. 생성자 함수에 의해 생성된 객체를 인스턴스라 한다.
    - 자바스크립트는 String, Number, Function, Array, Date, RegExp, Promise 등 빌트인 생성자 함수를 제공한다.

    Object 생성자 함수를 사용해 객체를 생성하는 방식은 특별한 이유가 없다면 그다지 유용하지 않다.

  • 생성자 함수

    - 일반 함수와 동일한 방법으로 생성자 함수를 정의하고 new 연산자와 함께 호출하면 해당 함수는 생성자 함수로 동작한다. 만약 new 연산자와 함께 생성자 함수를 호출하지 않으면 생성자 함수가 아니라 일반 함수로 동작한다.
    - 생성자 함수의 역할은 프로퍼티 구조가 동일한 인스턴스를 생성하기 위한 템플릿으로서 동작하여 인스턴스를 생성하는 것과 생성된 인스턴스를 초기화하는 것이다.

18장 (함수와 일급 객체)

  • 일급 객체
    - 무명의 리터럴로 생성할 수 있다. 즉, 런타임에 생성이 가능하다.
    - 변수나 자료구조(객체, 배열 등)에 저장할 수 있다.
    - 함수와 매개변수에 전달할 수 있다.
    - 함수의 반환값으로 사용할 수 있다.


    - 함수가 일급 객체라는 것은 함수를 객체와 동일하게 사용할 수 있다는 의미이다. 객체는 값이므로 함수는 값과 동일하게 취급할 수 있다. 따라서 함수는 값을 사용할 수 있는 곳이라면 어디서든지 리터럴로 정의할 수 있으며 런타임에 함수 객체로 평가된다.
    - 일급 객체로서 함수가 가지는 가장 큰 특징은 일반 객체와 같이 함수의 매개변수에 전달할 수 있으며, 함수의 반환값으로 사용할 수도 있다는 것이다.
    - 함수는 객체이지만 일반 객체와는 차이가 있다. 일반 객체는 호출할 수 없지만 함수 객체는 호출할 수 있고, 함수 고유의 프로퍼티를 소유한다.

  • 함수 객체의 프로퍼티
    - 자바스크립트는 함수의 매개변수와 인수의 개수가 일치하는지 확인하지 않는다. 따라서 함수 호출 시 매개변수 개수만큼 인수를 전달하지 않아도 에러가 발생하지 않는다.
    - arguments 객체 : 매개변수 개수를 확정할 수 없는 가변 인자 함수를 구현할 때 유용하다.

    - arguments 객체는 배열 형태로 인자 정보를 담고 있지만 실제 배열이 아닌 유사 배열 객체다. 유사 배열 객체란 length 프로퍼티를 가진 객체로 for문으로 순회할 수 있는 객체를 말한다.

0개의 댓글