18.1 일급객체

일급객체의 조건

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

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

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

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

return function () {
num = auxs(num);
return num;
};
}
// 3. 함수의 매개변수에 전달할 수 있다.
const increaser = makeCounter(auxs.increase);
console.log(increaser()); // 1
console.log(increaser()); // 2
// 3. 함수의 매개변수에 전달할 수 있다.
const decreaser = makeCounter(auxs.decrease);
console.log(decreaser()); // -1
console.log(decreaser()); // -2

18.2 함수 객체의 프로퍼티

function square(num) {
  return num * num;
}

console.dir(square);
// console.dir() : 객체를 **구조적으로** 보여준다. (함수의 속성 , 프로토타입 정보 등)

image.png

function square(num) {
  return num * num;
}
console.log(Object.getOwnPropertyDescriptors(square));
/* 
{
	length : {value: 1, writable: false, enumerable: false, configurable: true},
  name : {value: "square", writable: false, enumerable: false, configurable: true},
  arguments : {value: null, writable: false, enumerable: false, configurable: false},
  caller : {value: null, writable: false, enumerable: false, configurable: false},
  prototype : {value: {...}, writable: true, enumerable: false, configurable: false},
}
*/

//__proto__는 square 함수의 프로퍼티가 아니다.
console.log(Object.getOwnPropertyDescriptors(square, '__proto__'));
// undefined

// __proto__는 Object.prototype 객체 접근자 프로퍼티다.
// square 함수는 Object.prototype 객체로부터 __proto__ 접근자 프로퍼티를 상속 받는다.

console.log(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__'));