JavaScript는 흔히 프로토타입 기반 언어(prototype-based language)라 불립니다.— 모든 객체들이 메소드와 속성들을 상속 받기 위한 템플릿으로써 프로토타입 객체(prototype object)를 가진다는 의미입니다. 프로토타입 객체도 또 다시 상위 프로토타입 객체로부터 메소드와 속성을 상속 받을 수도 있고 그 상위 프로토타입 객체도 마찬가지입니다. 이를 프로토타입 체인(prototype chain)이라 부르며 다른 객체에 정의된 메소드와 속성을 한 객체에서 사용할 수 있도록 하는 근간입니다.
정확히 말하자면 상속되는 속성과 메소드들은 각 객체가 아니라 객체의 생성자의 prototype이라는 속성에 정의되어 있습니다.
비슷한 object들을 쉽게 만들고 싶을 때 사용. prototype을 사용하면 자식 object에게 데이터를 물려줄수 있다.
// 부모 - 자식에게 q & w를 물려줌
function 기계() {
this.q = 'pear';
this.w = 'pepper';
}
// 자식
var nunu = new 기계()
nunu를 console에 찍으면 {} 안에 있는 this.q & this.w 데이터가 출력 된다
기계()를 콘솔에 찍으면 {}가 똑같이 나온다 그런데 이 때, 기계()와 같이 생성되는 비밀 공간이 있다.
기계.prototype이라고 하면 {} 똑같이 데이터가 출력된다.
prototype은 유전자라고 생각하면 된다. 기계에서 물려받은 유전자.
// 부모 - 자식에게 q & w를 물려줌
function 기계() {
this.q = 'pear';
this.w = 'pepper';
}
⭐️ 기계.prototype.name = 'park' // 기계.prototype(유전자)이니까 기계의 유전자에 .name을 추가
// 그럼 아래 자식이 이 name을 사용 가능하다
// 그래서 nunu.name을 콘솔에 찍으면 'park'이 출력된다
// 자식
var nunu = new 기계()
부모 유전자에 있는걸 자식이 사용 가능한 이유?
object에서 자료를 뽑을 때
1) 직접 자료를 가지고 있으면 그걸 출력
2) 없으면 부모 유전자를 search
3) 부모의 부모 유전자까지 타고 올라간다 = prototype chain
자바스크립트 엔진은 코드를 실행하기 위해서 실행에 필요한 여러가지 정보들을 알고 있어야 한다. 예를 들면 변수(전역변수, 매개변수 등)와 변수의 유효 범위, this와 같은 정보들이 필요하다.
어떤 실행 컨텍스트가 활성화될 때, 자바스크립트 엔진은 해당 컨텍스트의 코드를 실행하는데 필요한 환경 정보들을 수집해서 실행 컨텍스트에 저장한다. 다시 말해, 실행 컨텍스트란 코드가 실행되기 위해 필요한 정보들을 가진 범위를 추상화하기 위해 객체 형태로 나타낸 것을 말한다.
- 실행할 코드에 제공할 환경 정보들을 모아놓은 객체
- 자바스크립트의 동적 언어로서의 성격을 가장 잘 파악할 수 있는 개념
- 자바스크립트는 실행 컨텍스트가 활성화되는 시점에 다음과 같은 현상이 발생한다
- 호이스팅이 발생한다 (선언된 변수를 위로 끌어올린다)
- 외부 환경 정보를 구성한다
- this 값을 설정한다.
- 이로 인해 다른 언어에서 발견할 수 없는 특이한 현상들이 발생한다.
클로저란 내부함수가 외부함수의 맥락(context: 매개변수, 변수 등)에 접근할 수 있는 경우를 의미한다.
function external() {
const name = "Ada Lovelace";
function internal() {
console.log(name);
}
internal();
}
내부 lexical 환경은 외부/전역 lexical 환경의 참조를 갖습니다. 코드에서 변수를 찾을 때 내부에서 찾고 없으면 외부, 그곳에도 없으면 전역 lexical 환경에서 찾습니다.