-
[Javascript 이론] Object_함수는 일급객체, 함수 고유의 프로퍼티는?To infinity/Javascript 이론 2021. 7. 8. 10:34
1. 일급객체
다음 조건을 만족한다면, 넌, 일급객체다.
- 무명의 리터럴로 생성가능. 즉, 런타임에 생성이 가능하다
- 변수나 자료구조(객체, 배열 등)에 저장할 수 있다.
- 함수의 매개변수에 전달할 수 있다.
- 함수의 반환값으로 사용할 수 있다.
=> 함수형 프로그래밍을 가능케하는 자바스크립트의 장점
자바스크립트의 함수는 위 조건을 모두 충족하므로 일급객체다.
즉, 함수를 객체와 동일하게 사용할 수 있다는 것이다.
객체는 값이므로 함수는 값이다.
함수객체는 일반객체에 없는 함수 고유의 프로퍼티를 소유한다.
프로퍼티
예를 들어보자
__proto__ : Oject.prototype 객체의 프로퍼티 (접근자 프로퍼티)
arguments, caller, length, name, prototype: 함수 객체 고유의 프로퍼티 (데이터 프로퍼티)
함수도 객체이므로 객체의 프로퍼티를 상속받아 사용할 수 있는 것이다.
2. 함수객체의 프로퍼티
1) arguments 프로퍼티
- 함수 호출 시 전달된 인수를 보관한다. (매개변수들을 보관한다)
해당 형태로 보관 => 프로퍼티 키: 인수의 순서 / 프로퍼티 값: 인수
- 많이 들어오면 많이 들어오는대로, 적게 들어오면 적게 들어오는대로 반환함.
즉, 매개변수의 개수와 함수호출 시 전달하는 인수의 개수를 확인하지 않음.
따라서 들어오는 인수의 개수를 확인하지 않으므로 가변인자함수를 구현할 때 유용
- arguments 프로퍼티는유사배열객체이므로 length프로퍼티가 있으므로 for문 순회 가능하다.
하지만 배열이 아니기 때문에 배열 메서드를 사용하면 에러가 발생하므로 Function.prototype.call / apply를 사용해 간접호출 해야한다.
// arguemtns를 배열로 변환하기 위해 간접호출
function sum( ) {
const array = Array.prototype.slice.call(arguements);
return array.reduce(function (pre, cur) {
return pre + cur;
}, 0);
}- 번거로우니 ES6에서는 Rest 파라미터를 도입했다. 따라서 Rest 파라미터를 사용하면 객체를 배열로 변환해줄 필요가 없다. (간접호출하지 않아도 된다)
function sum(...args) {
return args.reduce((pre,cur) => pre + cur, 0);
}2) caller 프로퍼티
ECMAScript 사양에 포함되지 않은 비표준 프로퍼티
Passsss
3) length 프로퍼티
함수 정의 시 선언한 매개변수의 개수
arguments 객체의 length 프로퍼티 값과 함수 객체의 length 프로퍼티 값은 다를 수 있으니 주의하자.
4) name 프로퍼티
함수의 이름을 나타냄
익명함수 표현식의 경우에는 ES5와 ES6의 동작이 다르다.
var anonymousFunc = function( ) { };
// ES5 : 빈 문자열
// ES6: anonymousES5: 프로퍼티 값은 빈 문자열
ES6: 프로퍼티 값은 함수객체를 가리키는 변수이름
5) __proto__ 접근자 프로퍼티
모든 객체는 [[Prototype]] 이라는 내부슬롯을 갖고 이 슬롯은 객체지향 프로그래밍의 상속을 구현하는 프로토타입 객체를 가리킨다.
__proto__ 프로퍼티는 [[Prototype]] 내부슬롯이 가리키는 프로토타입 객체에 접근하기 위해 사용하는 접근자 프로퍼티다. 왜냐면 직접 내부슬롯에 접근할 수 없기 때문이다.
6) prototype 프로퍼티
생성자 함수로 호출할 수 있는 함수객체, 즉 constructor만이 소유하는 프로퍼티다.
생성자 함수가 생성할 인스턴스의 프로토타입 객체를 가리킨다.
요약
객체는 객체의 프로퍼티가 존재한다. (접근자 프로퍼티, __proto__)
함수는 일급객체이다.
함수도 객체이므로 객체의 프로퍼티를 상속받는다.
하지만 다른 객체와는 다르게 함수객체의 고유의 프로퍼티도 존재한다.
함수객체 고유의 프로퍼티는 arguments, caller, length, name, prototype (생성자 함수로 호출하는 함수객체만) 가 있다.
함수객체 프로퍼티 조회 arguemtns caller length name prototye
(생성자 함수로 호출하는 함수객체만)__proto__ 함수객체 고유의 프로퍼티 arguemtns caller length name prototype 객체의 프로퍼티 __proto__ 'To infinity > Javascript 이론' 카테고리의 다른 글
[Javascript] 변수 let, const (0) 2024.01.14 [Javascript] Object_프로토타입 1 (0) 2021.07.08 [Javascript 이론] Object 프로퍼티 열거 시 특징 (for...in문) (0) 2021.07.08 [Javascript 이론] 객체의 프로퍼티 키, 값 불러오는 법 (0) 2021.07.08 [Javascript 이론] Map (feat. object) (0) 2021.07.04