일급객체의 조건
// 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
function square(num) {
return num * num;
}
console.dir(square);
// console.dir() : 객체를 **구조적으로** 보여준다. (함수의 속성 , 프로토타입 정보 등)
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__'));