✍️ JS 공부기록(0530~0602) - Deep Dive

제론·2022년 6월 3일
0
post-thumbnail

18장: 함수와 일급 객체

일급 객체란 무엇인가?!

  1. 무명의 리터럴 생성
  2. 변수나 자료구조에 저장 가능
  3. 함수의 매개변수에 전달 가능
  4. 함수의 반환값으로 사용 가능
  • 함수는 일급객체!

함수와 일반객체와의 차이

  1. 함수는 호출 가능하다.
  2. 함수 고유의 프로퍼티를 갖는다.

함수 고유의 프로퍼티

  1. arguments 프로퍼티
  • 매개변수로 전달된 인수의 정보를 담고 있는 순회가능한 유사배열객체(함수 내부에서 지역변수 처럼 사용 가능)
  1. caller 프로퍼티
  • 함수 자신을 호출한 함수를 가리킴
  1. length 프로퍼티
  • 함수를 정의할 때 선언한 매개변수의 개수를 가리킴
  1. name 프로퍼티
  • 함수의 이름을 나타냄
  • 익명 함수일 때
    es5 -> 빈 배열
    es6 -> 함수 객체를 가리키는 식별자를 값으로 가짐
  1. proto 접근자 프로퍼티
  • 프로토타입 객체에 접근하기 위해 사용하는 접근자 프로퍼티
  1. prototype 프로퍼티
  • 생성자 함수로 호출할 수 있는 함수 객체, constructor만 소유하는 프로퍼티

19장: 프로토타입

객체지향 프로그래밍

-> 객체의 집합으로 프로그램을 표현하려는 프로그래밍 패러다임

객체

  • 속성을 통해 여러 개의 값을 하나의 단위로 구성한 복합적인 자료구조
  • 상태 데이터(프로퍼티)와 동작(메서드)을 하나의 논리적인 단위로 묶은 복합적인 자로구조
  • 고유한 기능을 수행하면서 다른 객체와의 관계성을 가짐

상속과 프로토타입

상속

  • 어떤 객체의 프로퍼티와 메서드를 그대로 넘겨받아 사용할 수 있는 것
  • 상속을 통해 중복 제거 - 공통 메서드를 인스턴스를 만들 때마다 생성하면 비효율적
    => 프로포타입으로 상속
    • 생성자 함수의 prototype 프로퍼티에 공통 메서드를 등록할 수 있음
    • 하나의 메서드를 필요할 때마다 상속받아 사용 가능!

프로포타입 객체

  • 어떤 객체의 상위(부모)객체의 역할을 하는 객체 -> 공유 프로퍼티 제공
  • 모든 객체는 [[prototype]] 내부 슬롯을 가짐(프로토타입의 참조) -> 객체 생성 방식에 따라 프로토타입 다름
  • ([[prototype]] 안에 프로토타입이 저장됨)
    • 일반 객체 경우 -> 프로토타입은 Object.prototype
    • 생성자 함수의 경우 -> 생성자 함수의 prototype 프로퍼티에 있는 객체

proto 접근자 프로퍼티

  • 자신의 [[prototype]] 접근하기 위해 prototype을 간접적으로 사용할 수 있음
  • 모든 객체는 proto를 통해 [[prototype]]에 간접적으로 접근 가능!(proto -> 프로토타입)
  • 접근자 프로퍼티는 자체 값X, get/set 프로퍼티 어트리뷰트로 구성
  • proto -> 값 지정: get, 값 할당: set
  • Object.prototype의 프로퍼티(객체들이 공통으로 소유하는 것) -> 어던 객체의 프로퍼티가 없다면 타고타고 올라가 Object.prototype이 검색된다(프로포타입 체이닝)

프로토타입에 접근하려는 이유

  • 상호참조에 의해 프로토타입 체인이 생성되는 것 막기 위해
  • 프로토타입 체인은 단방향 링크드 리스트로 구현되어야함!

proto로 접근 권장X -> 모든 객체가 proto 사용 가능X
-> getPrototypeOf 메서드를 사용할 것

함수 객체의 prototype 프로퍼티

  • 함수 객체만이 소유하는 prototype 프로퍼티는 생성자 함수가 생성할 인스턴스의 프로토타입을 가리킴
  • non-constructor는 prototype 프로퍼티가 없다

모든 객체 -> proto - 객체가 자신의 프로토타입에 접근 또는 교체하기 위해 사용
함수 객체(constructor) -> prototype 프로퍼티 - 인스턴스의 프로토타입을 할당하기 위해 사용

프로토타입의 constructor 프로퍼티와 생성자 함수
인스턴스 -> prototype(constructor를 가짐) -> 생성자 함수

=> 인스턴스는 prototype의 constructor를 상속받아 사용 가능

프로토타입의 생성 시점

리터럴로 생성된 객체의 생성자 함수와 프로토타입은 쌍으로 존재하기 때문에 => 프로토타입은 생성자 함수가 생성되는 시점에 같이 생성된다.

빌트인과 사용자 정의 함수 프로토타입 생성 시점

사용자 정의 함수

  • 생성자 함수 가장 먼저 실행 -> 함수 객체가 됨 -> 프로토타입도 같이 생성 -> 프로토타입은 생성자 함수의 prototype 프로퍼티에 바인딩 됨
  • 생성된 프로토타입은 언제나 Object.prototype

빌트인 생성자 함수

  • 전역 객체가 생성되는 시점(코드실행전)에 프로토타입 생성됨! -> 생성된 프로토타입은 prototype 프로퍼티에 바인딩 됨
  • 객체 생성 전 이미 생성자함수 프로토타입 존재하고 생성자 또는 리터럴로 객체가 생성하면 프로토타입은 해당 객체의 [[Prototype]] 내부슬롯에 할당됨

객체 생성방식과 프로토타입 결정

  • OrginaryObjectCreate - 프로토타입을 만들어 객체에 전달해줌
  • 프로토타입은 추상 연산 OrginaryObjectCreate에 전달되는 인수에 의해 결정됨

객체 생성방식에 따른 프로퍼티 추가 방식 차이

  • 객체리터럴 -> 객체 리터럴 내부에 프로퍼티 추가
  • 생성자함수 -> 일단 빈객체 생성, 프로퍼티 추가

프로토타입 체인

  • JS가 객체지향 프로그래밍의 상속을 구현하는 메커니즘
  • 객체의 메서드에 접근하려 할 때 [[prototype]] 내부 슬롯의 참조를 따라서 부모쪽으로 순차적으로 검색
  • 프로토타입 체인을 통해 부모자식간 상속과 검색을 할 수 있음!
  • 프로퍼티말고 식별자는 스코프 내에서 검색함!(스코프 체인 -> 스코프의 계층적 구조)
  • 스코프 체인과 프로토타입 체인은 서로 협력하여 식별자와 프로퍼티 검색!
profile
Software Developer

0개의 댓글