함수와 일급 객체

박경빈·2023년 10월 4일
0
post-thumbnail

일급객체

일급객체(First-class Object)란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다.
일급 객체의 조건

  • 무명의 리터럴로 생성할 수 있다.
  • 변수나 자료구조(객체, 배열 등)에 저장할 수 있다.
  • 함수의 매개변수에 전달할 수 있다.
  • 함수의 반환값으로 사용할 수 있다.
// 1. 함무명의 리터럴로 생성할 수 있다.
// 2. 함수는 변수에 저장할 수 있다.
// 런타임(할당 단계)에 함수 리터럴이 평가되어 함수 객체가 생성되고 변수에 할당된다.
const increase = function (num) {
	return ++num;
};

const decrease = function (num) {
	return --num;
};

// 2. 함수는 객체에 저장할 수 있다.
const auxs = { increase, decrease};

// 3. 함수의 매개변수에 전달할 수 있다.
// 4. 함수의 반환값으로 사용할 수 있다.
function makeCounter(aux) {
	let num = 0;
    
  	return function () {
      num = aux(num);
      return num;
	};
}

// 3. 함수는 매개변수에게 함수를 전달할 수 있다.
const increaser = makeCounter(aux.increase);
console.log(increaser()); // 1
console.log(increaser()); // 2

함수가 일급 객체라는 것은 함수를 객체와 동일하게 사용할 수 있다는 의미다.
일급 객체로서 함수가 가지는 가장 큰 특징은 일반 객체와 같이 함수의 매개변수에 전달할 수 있으며, 함수의 반환값으로 사용할 수도 있다는것이다.
이는 함수형 프로그래밍을 가능케 하는 자바스크립트의 장점 중 하나다.

함수 객체의 프로퍼티

  • arguments 프로퍼티
function multiplay(x, y) {
	console.log(arguments);
    return x * y
}

console.log(multiply()); //NaN
console.log(multiply(1)); //NaN
console.log(multiply(1, 2)); //2
console.log(multiply(1, 2, 3)); //2
  • caller 프로퍼티
  • length 프로퍼티 - 함수 객체의 length 프로퍼티는 함수를 정의할 때 선언한 매개변수의 개수를 가리킨다.
function foo() {}
console.log(foo.length); // 0

function bar(x) {
	return x;
}
console.log(bar.length); // 1

function baz(x, y) {
	return x + y;
}
console.log(baz.length); // 2
  • name 프로퍼티 - 함수 이름을 나타낸다.
// 기명 함수 표현식
var namedFunc = function foo() {};
console.log(namedFunc.name); // foo

// 익명 함수 표현식
var anoymousFunc = function() {};
// ES5: name 프로퍼티는 빈 문자열을 값으로 갖는다.
// ES6: name 프로퍼티는 함수 객체를 가리키는 변수 이름을 값으로 갖는다.
console.log(anymousFunc.name); // anoymousFunc

// 함수 선언문
function bar() {}
console.log(bar.name); // bar
  • _ _ proto _ _접근자 프로퍼티
const obj = { a: 1 }

// 객체 리터럴 방식으로 생성한 객체의 프로토타입 객체는 Object.prototype이다.
console.log(obj.__proto__ === Object.prototype); // true;

// 객체 리터럴 방식으로 생성한 객체는 프로토타입 객체인 Object.prototype의 프로퍼티를 상속받는다.
// hasOwnProperty 메서드는 Object.prototype의 메서드다.
console.log(obj.hasOwnProperty('a')); // true
console.log(obj.hasOwnProperty('__proto__')); // true 
  • prototype 프로퍼티 - 함수가 객체를 생성하는 생성자 함수로 호출될 때 생성자 함수가 생성할 인스턴스의 객체를 가리킨다.
// 함수 객체는 prototype 프로퍼티를 소유한다.
(function () {}).hasOwnProperty('prototype'); // true

// 일반 객체는 prototype 프로퍼티를 소유하지 않는다
({}).hasOwnProperty('prototype'); // false
profile
꺾여도 하는 마음

0개의 댓글