자바스크립트 22

[JavaScript 스터디] 클래스

클래스는 함수임 새로운 객체 생성 방식 클래스 정의 class 키워드 사용 class Car {} // 클래스 선언문 const a = class {}; // 익명 클래스 표현식 const b = class Person {}; // 기명 클래스 표현식 클래스를 표현식으로 정의할 수 있다는 것 --> 일급 객체 클래스 몸체에는 0개 이상의 메서드 정의 가능 메서드 종류 constructor, 프로토타입 메서드, 정적 메서드 클래스 호이스팅 런타임 이전에 평가되어 함수 객체 생성 --> 이때 생성된 생성자 함수 객체 === constructor 클래스 선언문 이전에 일시적 사각지대 발생 클래스는 클래스 정의 이전에 참조 불가능 인스턴스 생성 인스턴스 생성이 유일한 목표 --> new 연산자와 함께 호출 메서..

[JavaScript 스터디] 클로저

함수와 그 함수가 선언된 렉시컬 환경의 조합 자바스크립트 고유의 개념이 아님 렉시컬 스코프 함수를 정의한 위치에 기반한 스코프 상위 스코프에 대한 참조는 함수 정의가 평가되는 시점에서 정의된 위치에 따라 결정됨 [[Environment]] 함수는 내부 슬롯 [[Environment]]에 상위 스코프의 참조(정의된 환경)를 저장함 따라서 자신의 상위 스코프를 [[Environment]]를 통해서 확인함 함수 렉시컬 환경의 외부 렉시컬 환경에 대한 참조에 함수 객체의 [[Environment]]에 저장된 참조값이 할당됨 클로저와 렉시컬 환경 클로저 외부 함수보다 중첩 함수가 오래 유지되는 경우, 중첩 함수는 생명주기가 종료된 외부 함수의 변수를 참조할 수 있음 중첩 함수가 상위 스코프의 식별자를 참조 + 중..

[JavaScript 스터디] 실행 컨텍스트

자바스크립트의 모든 코드를 관리하는 실체 Lexical Environment와 Variable Environment로 이뤄짐 소스코드 타입 전역 코드 : 전역에 존재하는 소스코드. 함수/클래스의 내부 코드는 포함X 전역 스코프 생성 전역 객체와 연결 코드 평가 후 전역 실행 컨텍스트 생성 함수 코드 : 함수 내부에 존재하는 소스코드 지역 스코프 생성 전역 스코프에 스코프 체인 코드 평가 후 함수 실행 컨텍스트 생성 eval 코드 : eval의 인수로 전달되는 소스코드 Strict mode에서 자신만의 독자적인 스코프 생성 코드 평가 후 eval 실행 컨텍스트 생성 모듈 코드 : 모듈 내부에 존재하는 소스코드 모듈별 모듈 스코프 생성 코드 평가 후 모듈 실행 컨텍스트 생성 소스코드의 평가와 실행 자바스크립..

[JavaScript 스터디] this

메서드가 자신이 속한 객체의 프로퍼티를 참조하려면 자신이 속한 객체를 가리키는 식별자를 참조해야 함 자신이 속한 객체, 자신이 생성할 인스턴스 --> 자기 참조 변수 자바스크립트 엔진이 암묵적으로 생성 함수 호출 방식, this 바인딩 this 바인딩은 함수 호출 방식에 따라 동적으로 결정됨 일반 함수 호출 기본적으로 전역 객체에 바인딩됨 일반 함수로 호출된 모든 함수 내부에서 this는 전역 객체 메서드 호출 메서드를 호출한 객체가 바인딩됨 메서드는 객체에 포함된 것이 아닌, 독립적인 존재(별도의 객체) 따라서, this에 바인딩될 객체는 호출 시점에 결정됨 생성자 함수 호출 생성자 함수가 생성할 인스턴스가 바인딩 됨 Function.prototype.apply/call/bind에 의한 간접 호출 이들..

[JavaScript 스터디] 빌트인 객체

ECMA Script에 정의된 객체 Math, Reflect, JSON을 제외하고 모두 생성자 함수 자바스크립트 객체 분류 표준 빌트인 객체 : ECMA Script에 정의된 객체 호스트 객체 : 자바스크립트 실행 환경(node.js, browser) 사용자 정의 객체 : 사용자가 직접 정의한 객체 원시값, 래퍼 객체 원시값에서 표준 빌트인 객체의 함수 사용할 때, 임시로 래퍼 객체 생성 래퍼 객체 : 문자열, 숫자, 불리언 값에 대해 객체와 같이 접근할 때, 생성되는 객체 원시값에서 임시로 생성된 래퍼 객체는 상황이 종료되면, GC(Garbage Collection) 대상이 됨 전역 객체 코드 실행 전에 자바스크립트 엔진이 생성하는 특수 객체. 최상위 객체 표준 빌트인 객체, 호스트 객체, var로 선..

[JavaScript 스터디] strict mode

자바스크립트 엔진은 식별자 선언을 하지 않아도 암묵적으로 전역객체의 프로퍼티로 식별자를 동적 생성 --> 암묵적 전역 이러한 예상치 못한 문제를 해결하기 위해 좀 더 엄격하게 문법 체크 암묵적 전역, 변수 삭제/중복, with 문 사용시 에러를 발생시킴 전역이나 함수 몸체의 첫 줄에 'use strict'를 추가하면 strict mode 적용 반드시 적용할 범위의 가장 앞에 선언해야 함 함수 몸체에 선언하면 적용 범위는 함수 몸체 전역에 선언하면 적용 범위는 스크립트 단위 전역에 적용하면 스크립트 단위로 적용됨 --> 여러 스크립트에 개별적으로 선언하기 어려움. 문제 발생 가능성 마찬가지로 모든 함수에 적용하기도 불가능함 --> 일관성 X 따라서 즉시 실행 함수로 감싼 스크립트 단위로 사용하는 것이 좋음..

[JavaScript 스터디] 프로토타입

자바스크립트는 프로토타입을 기반으로 상속을 구현 상위 객체의 역할 --> 공유 프로퍼티 제공 객체 리터럴 객체의 프로토타입 --> Object.prototype 생성자 함수에 의한 객체으 프로토타입 --> 생성자 함수의 prototype에 바인딩된 객체 모든 객체는 하나의 프로토타입을 보유함 모든 객체는 __proto__를 통해서 자신의 [[prototype]](프로토타입)에 접근 객체의 __proto__는 Object.prototype.__proto__ 임 함수 객체는 객체중 유일하게 prototype 프로퍼티를 가지고 있음 --> 생성자 함수가 생성할 인스턴스의 프로토타입 모든 객체의 __proto__와 함수 객체의 prototype는 가리키는 대상이 같음. 사용 주체가 다를 뿐(전자는 객체 자신, ..

[JavaScript 스터디] 함수 객체, 일급 객체

일급 객체 무명 리터럴로 생성 가능 === 런타임에 생성 가능 변수, 자료구조에 저장 가능 함수의 매개변수에 전달 가능 함수의 반환값으로 사용 가능 함수 객체의 프로퍼티 함수 === 객체, 함수로 프로퍼티 보유 가능 arguments 인수들의 정보 저장 Iterable한 유사 배열 객체 --> 배열이 아님 --> 배열 메서드 사용 불가능 함수 내 지역변수로 사용 가변 인자 함수 구현에 주로 사용 name 함수의 이름 __proto__ [[prototype]] 내부 슬롯을 참조하는 데 사용 prototype 생성자 함수로 호출할 수 있는 함수 객체 --> constructor만 소유하고 있음 일반 객체와 Non-constructor는 이 프로퍼티가 없음 생성자 함수가 생성하는 인스턴스의 prototype을..

[JavaScript 스터디] 생성자 함수로 객체 생성

Object 생성자 함수 new와 함께 호출하면 빈 객체 생성 생성자 함수에 의해 생성된 객체 --> 인스턴스 생성자 함수 객체 리터럴 객체 생성 --> 하나의 객체만 생성함 --> 다수의 객체 생성 불가능 생성자 함수로 객체를 생성하면 구조가 동일한 객체를 여러개 생성할 수 있음 new 연산자와 함께 사용하지 않으면 일반함수로 취급됨 --> 내부적으로 [[constructor]]가 아닌 [[call]]이 호출 인스턴스 생성은 필수, 인스턴스 초기화는 옵션 생성자 함수의 객체 생성 : 인스턴스 생성, this 바인딩 --> 인스턴스 초기화 --> 인스턴스 반환 모든 함수 객체가 [[constructor]]를 갖지는 않음 Constructor : 함수 선언문, 함수 표현식, 클래스 Non-construct..

[JavaScript 스터디] Property Attribute

프로퍼티의 상태를 나타내는 속성, 자바스크립트 엔진이 프로퍼티를 생성할 때 기본적으로 정의함 값(value), 갱신 가능 여부(writable), 일치 가능 여부(enumerable), 재정의 가능 여부(configurable) 내부 슬롯, 내부 메서드 ECMA Script에서 정의된 의사 프로퍼티(Pseudo property), 의사 메서드(Pseudo method) 자바스크립트 엔진의 내부로직 --> 개발자가 직접 접근 불가능 일부 내부 슬롯/메서드에 한해서 간접 참조 제공 Ex) 모든 객체는 [[prototype]]을 내부 슬롯으로 가짐 --> __proto__를 통해서 참조 가능 Property Descriptor Property attribute 정보를 제공해주는 객체 Object.getOwnP..