18장: 함수와 일급 객체
일급 객체란 무엇인가?!
- 무명의 리터럴 생성
- 변수나 자료구조에 저장 가능
- 함수의 매개변수에 전달 가능
- 함수의 반환값으로 사용 가능
함수와 일반객체와의 차이
- 함수는 호출 가능하다.
- 함수 고유의 프로퍼티를 갖는다.
함수 고유의 프로퍼티
- arguments 프로퍼티
- 매개변수로 전달된 인수의 정보를 담고 있는 순회가능한 유사배열객체(함수 내부에서 지역변수 처럼 사용 가능)
- caller 프로퍼티
- length 프로퍼티
- 함수를 정의할 때 선언한 매개변수의 개수를 가리킴
- name 프로퍼티
- 함수의 이름을 나타냄
- 익명 함수일 때
es5 -> 빈 배열
es6 -> 함수 객체를 가리키는 식별자를 값으로 가짐
- proto 접근자 프로퍼티
- 프로토타입 객체에 접근하기 위해 사용하는 접근자 프로퍼티
- 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]]
내부 슬롯의 참조를 따라서 부모쪽으로 순차적으로 검색
- 프로토타입 체인을 통해 부모자식간 상속과 검색을 할 수 있음!
- 프로퍼티말고 식별자는 스코프 내에서 검색함!(스코프 체인 -> 스코프의 계층적 구조)
- 스코프 체인과 프로토타입 체인은 서로 협력하여 식별자와 프로퍼티 검색!