[[call]]과 [[constructor]]은 자바스크립트의 내장된 특수한 함수입니다. 이 두 함수는 객체 지향 프로그래밍에서 클래스와 인스턴스 생성에 사용됩니다. 각각의 역할과 동작 방식을 살펴보겠습니다.
[[call]]:
함수명(arguments)
형태이지만, 내부적으로는 함수명.[[call]](this, arguments)
와 같이 동작합니다.[[constructor]]:
constructor(arguments)
형태로 호출하면 내부적으로 new 클래스명(arguments)
와 같이 동작합니다.예시를 통해 이해를 도울 수 있습니다.
// 클래스 정의
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
sayHello() {
console.log(`Hello, my name is ${this.name} and I'm ${this.age} years old.`);
}
}
// 인스턴스 생성
const john = new Person("John", 25);
// 메소드 호출
john.sayHello(); // 출력: Hello, my name is John and I'm 25 years old.
위의 예시에서 [[constructor]]
는 Person
클래스의 생성자 역할을 합니다. new Person("John", 25)
구문을 통해 인스턴스 john
을 생성하고, [[constructor]]
메소드 내부에서 this.name
과 this.age
에 전달된 값이 할당됩니다.
[[call]]
은 클래스가 아닌 일반 함수 객체에서 사용됩니다. 함수 호출 시에 해당 함수 객체의 [[call]]
메소드가 호출되며, 함수 내부의 코드 블록이 실행됩니다.
// 일반 함수 객체
function greet(name) {
console.log(`Hello, ${name}!`);
}
// 함수 호출
greet("Alice"); // 출력: Hello, Alice!
위의 예시에서 [[call]]
은 greet
함수 객체의 호출에 사용됩니다. greet("Alice")
구문을 통해 [[call]]
메소드가 호출되고, 함수 내부의 코드 블록이 실행되어 "Hello, Alice!"가 출력됩니다.
요약하자면, [[call]]은 함수 객체의 호출을 처리하는 메소드로서 함수의 코드 블록을 실행하고 값을 반환합니다. 반면 [[constructor]]는 클래스의 생성자 역할로서 객체를 초기화하고 인스턴스를 반환합니다.