diff --git "a/[17] \354\203\235\354\204\261\354\236\220 \355\225\250\354\210\230\354\227\220 \354\235\230\355\225\234 \352\260\235\354\262\264 \354\203\235\354\204\261/README.md" "b/[17] \354\203\235\354\204\261\354\236\220 \355\225\250\354\210\230\354\227\220 \354\235\230\355\225\234 \352\260\235\354\262\264 \354\203\235\354\204\261/README.md" new file mode 100644 index 0000000..93923c6 --- /dev/null +++ "b/[17] \354\203\235\354\204\261\354\236\220 \355\225\250\354\210\230\354\227\220 \354\235\230\355\225\234 \352\260\235\354\262\264 \354\203\235\354\204\261/README.md" @@ -0,0 +1,78 @@ +# 생성자 함수란? + +생성자 함수는 new 연산자와 함께 호출해서 객체를 생성할 수 있는 함수를 말한다. 이런 생성자 함수를 사용해서 인스턴스(객체)를 생성할 수 있다. + +# 객체 리터럴 방식이 아니라 생성자 함수를 사용하는 이유 + +아래는 객체 리터럴 방식을 통해서 객체를 생성하는 경우인데, 이때 동일한 프로퍼티를 가진 객체를 여러개 생성할 때 같은 객체 리터럴 방식으로 프로퍼티를 기술해야하는 점이 비효율 적이다. + +```javascript +const obj = { + state: 'state', + getState() { + return this.state; + } +} +``` + +생성자 함수는 객체를 생성하는 템플릿처럼 이런 생성자 함수를 통해서 프로퍼티 구조가 동일한 인스턴스를 쉽게 반복적으로 생성할 수 잇따. + +# 생성자 함수 사용방법 + +생성자 함수는 함수에 new 연산자와 함께 호출하는 방식으로 동작한다. new 연산자가 없으면 일반 함수와 동일하게 동작해서 함수내에서 this를 사용한다면 이때의 this는 window(브라우저) 객체이다. + +```javascript +function func1() { + this.propertyOfFunc1 = 'hello' +} + +// 생성자, 이때의 this는 생성될 인스턴스 +const obj = new func1(); +console.log(obj.propertyOfFunc1) + +// 일반 함수호출, 이때의 this는 window +func1(); +console.log(window.propertyOfFunc1) +``` + +이때 생성자 함수가 new 연산자 없이 호출되는 것을 막지 않으면 예기치 않게 전역객체에 프로퍼티가 할당 될수 있다. 이를 방지하기 위해서 `new.target`을 사용할 수 있다. + +`new.target`은 생성자로 호출된 함수내에서는 `자기자신`을 가르키지만, 일반함수로 호출되는 경우에는 `undefined` 값을 가진다. + +```javascript +function func1() { + if(!new.target){ + return new func(); + } + this.propertyOfFunc1 = 'hello' +} +``` + +이를 통해서 생성자로 호출 되지 않은 경우에도 인스턴스를 생성해서 반환한다. 되지 + +# 생성자 함수를 통해서 인스턴스가 생성되는 과정 + +```javascript +function Sample(state){ + // 초기화 + this.state = state; + this.getState = function() { + return this.state + } +} + +const Sample = new Sample(1); // 런타임 이전에 암묵적으로 빈객체를 생성하고 this 바인딩을 한다. 런타임에 실제로 값을 초기화한다. +``` + +위와 같은 생성자 함수는 인스턴스를 생성하고, 초기화하고 생성한 인스턴스를 반환한다. 상세한 과정은 아래와 같다. +1. 인스턴스를 생성하고, this에 바인딩 된다. + - 생성자 함수가 실행되면 암묵적으로 빈객체가 생성되고, 이가 이 생성자 함수의 this에 바인딩이 된다. + - 런타임 이전에 instance가 생성되고, this가 바인딩 된다. + - 런타임때는 인스턴스가 초기화 되고 인스턴스를 반환한다. +2. 인스턴스 초기화 + - 생성자 함수 내의 코드가 실행되고, 암묵적으로 생성된 인스턴스에 해당 값을 정의한다. + +3. 암묵적으로 this를 반환한다. + +# Ref +- 모던 자바스크립트 딥다이브 diff --git "a/[19] \355\224\204\353\241\234\355\206\240\355\203\200\354\236\205/README.md" "b/[19] \355\224\204\353\241\234\355\206\240\355\203\200\354\236\205/README.md" new file mode 100644 index 0000000..b85f01a --- /dev/null +++ "b/[19] \355\224\204\353\241\234\355\206\240\355\203\200\354\236\205/README.md" @@ -0,0 +1,43 @@ +# 프로토타입이란? + +JavaScript는 multiparadigm programming language로 프로토타입 기반의 객체 지향 언어로도 사용할 수 있다. + +# 상속과 프로토타입 + +생성자 함수를 이용하면 동일한 프로퍼티 구조를 가지는 객체를 생성하기 용이하다. + +```javascript +function Obj(state){ + this.state = 'state'; + this.getState() = function() { + return this.state; + } +} +``` + +위의 생성자 함수를 통하면 인스턴스를 생성할 수 있는데, `state`와 `getState`가 각 인스턴스의 프로퍼티가 된다. 하지만 getState의 경우 모든 인스턴스가 동일하게 사용하는 부분으로 인스턴스끼리 공유해서 사용할 수 있는 것이 바람직하다. + +```javascript +function Obj(state){ + this.state = 'state'; +} + +Obj.prototype.getState = function() { + return this.state; +} +``` + +Obj의 prototype에 getState메서드를 추가한다. 이를 통해 Obj 생성자 함수를 통해서 생성된 인스턴스들은 getState함수를 상속받아서 사용할 수 있다. + +# 프로토티입의 생성 시점 +프로토타입은 생성자 함수가 생성되는 시점에 생성자 함수와 한쌍으로 생성된다. 즉, 함수 중에 생성자 함수로 호출이 가능한 경우, 이 함수가 평가 되어 함수 객체가 생성될때 프로토타입까지 생성된다. 이때 생성된 프로토타입은 오직 `constructor 프로퍼티`만을 가진다. + +# 프로토타입 체인이란? + +> 자바스크립트는 객체의 프로퍼티(메서드 포함)에 접근하려고 할 대 해당 객체에 접근하려는 프로퍼티가 없다면 [[prototype]] 내부 슬롯 참조를 따라 자신의 부모 역할을 하는 프로토타입의 프로퍼티를 순차적으로 검색한다. 이를 프로토타입 체인이라 한다. 프로토타입 체인은 자바스크립트가 객체지향 프로그래밍의 상속을 구현하는 매커니즘이다. - 모던 자바스크립트 딥다이브 p.286 + +즉, 프로토타입 체인을 통해서상송과 프로퍼티를 검색하는 매커니즘이 구현되어있고, 식별자의 경우 스코프 체인을 통해서 검색한다. +`a.method()` 라는 코드의 경우, 스코프 체인을 통해 a 식별자를 검색한다음, a 객체의 프로토타입 체인 내에서 `method`라는 메서드를 찾는다. + +# Ref +- 모던 자바스크립트 딥다이브 \ No newline at end of file diff --git "a/[25] \355\201\264\353\236\230\354\212\244/README.md" "b/[25] \355\201\264\353\236\230\354\212\244/README.md" new file mode 100644 index 0000000..b562324 --- /dev/null +++ "b/[25] \355\201\264\353\236\230\354\212\244/README.md" @@ -0,0 +1,4 @@ +# 클래스란? + +# Ref +- 모던 자바스크립트 딥다이브 \ No newline at end of file