일급객체의 조건
함수는 위의 조건을 모두 만족하므로 일급 객체이다.
// 1. 함수는 무명의 리터럴로 생성할 수 있다.
// 2. 함수는 변수에 저장할 수 있다.
const increase = function (num) {
return ++num;
};
// 2. 함수는 객체에 저장할 수 있다.
const predicates = { increase };
// 3. 함수는 매개변수에 전달할 수 있다.
// 4. 함수의 반환값으로 사용할 수 있다.
function makeCounter(predicates) {
let num = 0;
return function () {
num = predicates(num);
return num;
};
}
const increaser = makeCounter(predicates.increase)
function square(n) {
return n * n;
}
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 }
}
function arg(x, y) {
return arguments;
}
console.log(arg(1, 2)); // [Arguments] { '0': 1, '1': 2 }
console.log(arg(1, 2, "hi")); //[Arguments] { '0': 1, '1': 2, '2': 'hi' }
const obj = { a: 1 };
// 객체 리터럴 방식을 생성한 객체의 프로토타입 객체는 Object.prototype 이다.
console.log(obj.__proto__ === Object.prototype); // true
// obj 는 Object.prototype 을 상속받았기 때문에 Object.prototype의 메서드를 사용할 수 있다.
console.log(obj.hasOwnProperty("a")); // true
console.log(obj.hasOwnProperty("__proto__")); // false
console.log(function () {}.hasOwnProperty("prototype")); // true
console.log({}.hasOwnProperty("prototype")); // false