18.1 일급 객체
- 일급 객체 조건
- 무명의 리터럴로 생성 가능 (런타임에 생성 가능)
- 변수나 자료구조(객체, 배열 등)에 저장 가능
- 함수의 매개변수에 전달 가능
- 함수의 반환값으로 사용 가능
- 함수가 일급 객체이다 -> 함수를 객체와 동일하게 사용 가능
- 객체는 값이므로 함수는 값과 동일하게 취급 가능 (런타임에 함수 객체로 평가됨)
- 함수형 프로그래밍; 일반 객체와 같이 함수의 매개변수에 전달 가능, 함수의 반환값으로도 사용 가능
- 함수 객체는 일반 객체와의 차이 존재
- 함수 객체는 호출할 수 있고, 함수 객체는 일반 객체에는 없는 함수 고유의 프로퍼티 소유
18.2 함수 객체의 프로퍼티
- 함수도 객체임 -> 함수도 프로퍼티를 가질 수 있음
- __proto__는 함수의 프로퍼티가 아님 (Object.prototype 객체의 접근자 프로퍼티임)
- Object.prototype 객체로부터 __proto__ 접근자 프로퍼티 상속 받음
- 함수 객체의 데이터 프로퍼티: arguments, caller, length, name, prototype (모두 함수 객체의 고유 프로퍼티)
- Object.prototype 객체의 프로퍼티는 모든 객체가 상속받아 사용 가능
- arguments 프로퍼티
- 함수 객체의 arguments 프로퍼티 값은 arguments 객체임
- 함수 호출 시 전달된 인수들의 정보를 담고 있는 순회 가능한(iterable) 유사 배열 객체임
- array-like-object (실제 배열은 아님)
- length 프로퍼티 가진 객체로 for 문으로 순회 가능한 객체
- ES6부터 arguments 객체는 유사 배열 객체이면서 iterable
- 배열 메서드 사용하면 에러 발생 => Function.prototype.call/apply 사용해 간접 호출
- ES6에서 Rest 파라미터 도입
- 함수 내부에서 지역변수처럼 사용됨 (함수 외부에서 참조 불가)
- JS는 함수의 매개변수와 인수의 개수가 일치하는지 확인 안함 (에러 발생 X)
- 초과된 인수는 무시되지만 모든 인수는 암묵적으로 arguments 객체의 프로퍼티로 보관됨
- 프로퍼티 키: 인수의 순서 (인덱스), 프로퍼티 값: 인수
- callee 프로퍼티: 함수 자신 가리킴 (호출 당함)
- length 프로퍼티: 인수의 개수
- Symbol(Symbol.iterator) 프로퍼티: arguments 객체를 iterable로 만들기 위한 프로퍼티
- 매개변수 개수 확정할 수 없는 가변 인자 함수 구현할 때 유용
- caller 프로퍼티 (참고용)
- ECMAScript 사양에 포함되지 않은 비표준 프로퍼티
- length 프로퍼티
- 함수 정의할 때 선언한 매개변수의 개수를 가리킴
- arguments 객체의 length 프로퍼티와 함수 객체의 length 프로퍼티의 값은 다를 수 있음
- arguments 객체의 length 프로퍼티: 인자의 개수
- 함수 객체의 length 프로퍼티: 매개변수의 개수
- name 프로퍼티
- 함수의 이름을 나타냄
- ES6 정식 표준
- ES5와 ES6에서 동작 다름
- ES5: 익명 함수 표현식 -> name 프로퍼티 값은 빈 문자열
- ES6: 익명 함수 표현식 -> name 프로퍼티 값은 함수 객체를 가리키는 식별자
- 함수 이름과 함수 객체를 가리키는 식별자는 의미가 다름
- 함수 호출 시 함수 이름이 아닌 함수 객체를 가리키는 식별자로 호출
- 함수 선언문은 JS 엔진의 평가 과정에서 함수 이름과 동일한 이름의 식별자를 암묵적으로 생성하여
그곳에 함수 객체를 할당해서 함수 이름과 동일한 이름의 식별자로 호출 가능
- __proto__ 접근자 프로퍼티
- 모든 객체는 [[Prototype]]이라는 내부 슬롯 가짐
- [[Prototype]] - OOP의 상속을 구현하는 프로토타입 객체 가리킴
- __proto__ - [[Prototype]] 내부 슬롯이 가리키는 프로토타입 객체에 접근하기 위해 사용하는 접근자 프로퍼티
- [[Prototype]] 내부 슬롯에 직접 접근 불가, __proto__ 접근자 프로퍼티를 통해 간접적으로 프로토타입 객체 접근
- hasOwnProperty() 메서드
- prototype 프로퍼티
- 생성자 함수로 호출할 수 있는 객체, 즉 constructor만이 소유하는 프로퍼티
- 일반 객체와 non-constructor 에는 prototype 프로퍼티 없음
- prototype 프로퍼티는 생성자 함수가 생성할 인스턴스의 프로토타입 객체 가리킴
'Books > 모던 JS Deep Dive ✔️' 카테고리의 다른 글
[모던 JS Deep Dive] 20장 - strict mode (0) | 2021.12.30 |
---|---|
[모던 JS Deep Dive] 19장 - 프로토타입 (0) | 2021.12.30 |
[모던 JS Deep Dive] 17장 - 생성자 함수에 의한 객체 생성 (0) | 2021.12.21 |
[모던 JS Deep Dive] 16장 - 프로퍼티 어트리뷰트 (0) | 2021.12.20 |
[모던 JS Deep Dive] 15장 - let, const 키워드와 블록 레벨 스코프 (0) | 2021.12.15 |
댓글