Deep Dive 18장 함수와 일급객체

@hanminss·2021년 12월 6일
0

Deep Dive

목록 보기
10/16
post-thumbnail

1. 일급 객체

  • 일급객체의 조건

    1. 무명의 러터럴로 생성할 수 있다.
    2. 변수나 자료구조에 저장할 수 있다.
    3. 함수의 매개변수에 전달할 수 있다.
    4. 함수의 반환값으로 사용할 수 있다.
  • 함수는 위의 조건을 모두 만족하므로 일급 객체이다.

// 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)

2. 함수 객체의 프로퍼티

  • 함수의 프로퍼티를 알아보자
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 }
}
  • 기본적으로 함수에는 arguments, caller, length, name, prototype 5가지의 데이터 프로퍼티가 있다. name을 제외하고는 함수 객체 고유의 프로퍼티다.

arguments 프로퍼티

  • arguments 프로퍼티 값은 arguments 객체이다.
  • arguments 객체는 함수 호출 시, 전달된 인수의 정보를 담고 있는 iterable 한 유사 배열 객체이며 함수 내부에서 지역 변수처럼 사용된다.
  • arguments 프로퍼티는 ES3부터 표준에서 폐지되었으며 arguments 객체를 사용한다.(Function.arguments X, arguments O)
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' }
  • arguments의 사용은 가변 인자 함수를 구현하는데 유용하다.
  • arguments 객체는 배열 형태이지만 실제 배열이 아닌 유사 배열 객체 이다.
  • 유사 배열 객체 : length 프로퍼티를 가진 객체(for문으로 순회할 수 있는 객체)
  • 유사 배열 객체는 배열이 아니므로 배열 메서드를 사용할 순 없다.
  • ES6 rest 파라미터의 도입으로 arguments 객체의 중요성이 이전 같지는 않다.(24장)

caller 프로퍼티

  • caller 프로퍼티는 ES 사양에 포함되지 않은 비표준 프로퍼티이다.
  • 표준화 될 예정도 없는 프로퍼티 이므로 참고로만 알면 된다.
  • caller 프로퍼티는 함수 자신을 호출한 함수를 가리킨다.

length 프로퍼티

  • length 프로퍼티는 함수를 정의할 때 선언한 매개변수의 개수를 가리킨다.
  • 따라서 length 프로퍼티의 value 값은 매개변수의 개수이다.

name 프로퍼티

  • name 프로퍼티는 함수의 이름을 나타낸다.
  • ES6부터 정식 표준이 되었다. ES6 이전버전은 동작을 달리한다.
  • 익명함수 표현식의 경우 ES5에선 name프로퍼티는 빈 문자열을 값으로 갖는다.
  • ES6에선 함수 객체를 가리키는 식별자를 값으로 갖는다.

**proto** 접근자 프로퍼티

  • 모든 객체는 [[Prototype]]이라는 배부 슬롯을 갖는다. 이는 객체지향 프로그래밍의 상속을 구현하는 프로토타입 객체를 가리킨다.
  • proto 프로퍼티는 [[Prototyope]] 내부슬롯이 가리키는 프로토타입 객체에 간접 접근하기 위해 사용하는 접근자 프로퍼티다.
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
  • hasOwnProperty() : Object.property의 메서드이며 obj가 상속받았기 때문에 obj도 사용할 수 있다. 인수로 전달받은 프로퍼티 키가 객체 고유의 것이라면 ture를 반환단다.

prototype 프로퍼티

  • 생성자 함수로 호출할 수 있는 함수 객체, 즉 constructor 만이 소유하는 프로퍼티이다.
  • 일반 객체는 가지고 있지 않다.
console.log(function () {}.hasOwnProperty("prototype")); // true
console.log({}.hasOwnProperty("prototype")); // false

0개의 댓글