🔎 즉시 실행 함수란?
함수 정의와 동시에 즉시 호출되는 함수로, 단 한 번만 호출되며 다시 호출할 수 없음
(function greet() {
console.log("Hello");
})();
(function greet() {
console.log("Hello2");
}());
두 가지 모두 즉시 실행 함수이다.
그러나 프리티어 덕분인지, 저장하면 위의 형식으로 통일된다.
함수의 정의를 감싸냐, 호출하는 것을 감싸냐의 차이다.
괄호의 위치가 크게 문제되지는 않는다고 한다.
(...)
안에 있는 함수는 함수 리터럴로 동작(...)
로 감싸야 함// 함수 이름 생략되어 함수 선언문 형식에 맞지 않아서 에러
function() {
// ...
}();
// JS 엔진이 함수 선언문이 끝나는 블록 뒤에 세미콜론 추가
// 그룹 연산자에 피연산자가 없어서 에러
function foo() {
// ...
}();
// 그룹 연산자
(function () {
// ...
}());
(function () {
// ...
})();
// 그 외 연산자
!function () {
// ...
}();
+ function () {
// ...
}();
다음은 즉시 실행 함수를 사용하여 모듈 패턴을 구현한 예시다.
const myModule = (function () {
let privateVariable = "I am private";
return {
getPrivateValue() {
return privateVariable;
},
};
})();
console.log(myModule.getPrivateValue()); // I am private
모듈 패턴이란
자바스크립트에서 특정 코드의 기능을 캡슐화하고, 내부 구현을 외부에서 숨기기 위해 사용하는 디자인 패턴이다.
이렇게 사용함으로써 전역 변수를 오염시키지 않고, 내부에서 필요한 변수를 관리할 수 있다.
도저히 즉시 실행 함수에 대해 잘 와닿지 않아 어떻게 활용하는지에 대해 더 알아봤다.
이 분이 글을 간단하고도 깔끔하게 작성해주셔서 링크를 첨부한다! => 링크
🔎 생성자 함수란?
자바스크립트에서 객체를 생성하는 데 사용되는 특별한 형태의 함수
function Car() {
this.name = "Benz";
this.color = "white";
}
const car1 = new Car();
const car2 = {
name: "Benz",
color: "white",
};
console.log(car1);
console.log(car2);
출력하면 다음과 같이 나온다.
생성자 함수로 객체를 생성할 경우 생성자 함수 이름이 함께 출력된다.
function User() {
this.name = "철수";
this.age = 30;
}
const user = new User();
this
는 생성될 객체(= 인스턴스) 지칭this
는 함수를 호출한 대상을 지칭this
가 새로 생성된 객체를 가르키도록 설정🔎 인스턴스란?
생성자 함수로 만들어진 객체
🔎 프로토타입 (객체)란?
함수와 일대일로 배칭되는 프라이빗한 공간으로, 자바스크립트의 모든 함수는 프로토타입 소유
🔎 프로토타입이란?
자바스크립트의 모든 함수가 가지고 있는 각각의 고유한 속성이며, 자식 객체들이 자신을 참조할 수 있도록 만든 분신 객체
function Car() {
this.name = "Benz";
this.color = "white";
this.getInfo = function () {
return `${this.name}, ${this.color}`;
};
}
const car = new Car();
console.log(car);
위와 같이 Car 생성자 함수로 객체를 생성하면
이런 구조로 인스턴스 무한 생성 가능
function Car() {
this.name = "Benz";
this.color = "white";
}
Car.prototype.getInfo = function () {
return `${this.name}, ${this.color}`;
};
const car = new Car();
console.log(car);
위와 같이 Car 생성자 함수의 프로토타입 객체로 공통되는 메서드를 옮겨두면
모든 인스턴스는 Car 생성자의 프로토타입을 통해 공통 메서드에 접근 가능
콘솔창에 출력하면 다음과 같음
getInfo 메서드가 다른 프로퍼티와 같이 객체에 바로 위치 | getInfo 메서드가 [[Prototype]] 이라는 속성을 통해 getInfo 접근 가능 |
🔎 [[Prototype]]이란?
자바스크립트 객체의 프로토타입을 나타내는 내부 슬롯
[[Prototype]]
속성을 통해 다른 객체의 프로퍼티와 메서드 상속 가능const car = new Car();
console.log(car.getInfo());
🔎 프로토타입 체인이란?
인스턴스에서 자신을 생성한 생성자 함수의 프로토타입에 접근할 수 있는 방법
[[Prototype]]
__proto__
사용해야 함car.[[Prototype]] // 불가능
car[[[Prototype]]] // 불가능
car.__proto__ // 가능
car.getInfo()
는 실제로는 car.__proto__.getInfo()
__proto__
생략 가능하도록 해줌car.__proto__.getInfo()
접근은 불가this
는 자신을 호출한 객체를 의미하므로, 위와 같이 호출되면 this는 __proto__
가 되어버림🔎 프로토타입 체이닝이란?
인스턴스가 프로토타입 체인으로 프로퍼티나 메서드를 탐색해 나가는 과정
__proto__
를 따라 프로토타입으로 넓혀서 찾음🔎 래퍼 객체란?
기본 자료형인 원시 값들이 객체처럼 동작할 수 있도록 임시로 생성되는 객체
const PI = 3.1415926535897932384626433832;
console.log(PI.toFixed(2));
__proto__
를 통해 Number 객체의 프로토타입으로 연결되며, toFixed 메서드 접근__proto__
는 Object 객체의 프로토타입function Counter() {
let count = 0; // 클로저
this.increment = function () {
count++;
};
this.decrement = function () {
count--;
};
this.getCount = function () {
return count;
};
}
function createPerson(type, name) {
function Employee(name) {
this.name = name;
this.type = "employee";
}
function Manager(name) {
this.name = name;
this.type = "manager";
}
switch (type) {
case "employee":
return new Employee(name);
case "manager":
return new Manager(name);
}
}
const person = createPerson("employee", "John");
function Person(name) {
this.name = name;
}
// Person 생성자 함수의 프로토타입 객체에 introduce라는 메서드 생성
Person.prototype.introduce = function () {
return `I an ${this.name}`;
};
// 상속처럼 보여지게 코드를 구현할 수 있음
function Developer(name, position) {
Person.call(this, name);
this.position = position;
}
Developer.prototype = Object.create(Person.prototype);
Developer.prototype.constructor = Developer;
Object.create
로 Person.prototype을 상속받는 새로운 객체 생성Object.create
는 새로운 객체 생성 + 객체의 프로토타입을 특정 객체로 설정Developer.prototype.skill = function () {
return this.position;
};
const dev = new Developer("철수", "프론트개발자");
__proto__
는 Person 생성자 함수의 프로토타입 (Person.prototype)__proto__
는 Object 생성자 함수의 프로토타입 (Object.prototype)__proto__
는 Number 생성자 함수의 프로토타입__proto__
는 Object 생성자 함수의 프로토타입즉, 모든 함수의 프로토타입 객체는 Object 생성자 함수의 인스턴스