목표
- 25장의 내용을 최대한 이해하고 정리하기
// 생성자 함수
var Person = (function () {
function Persion(name) {
this.name = name;
}
// 프로토타입 메서드
Person.prototype.sayHi = functon () {
console.log("Hi! My name is "+ this.name);
};
return Person;
}());
var me = new Person("Lee");
me.sayHi();
class Person {}
class Person {
// 생성자
constructor(name) {
this.name = name
}
// 프로토타입 메서드
sayHi() {
// 인스턴스로 호출
console.log(`Hi ${this.name}`);
}
// 정적 메서드
static sayHello() {
// 클래스로 호출
console.log(`Hello ${this.name}`);
}
}
const me = new Person("Lee");
console.log(me.name);
me.sayHi();
Person.sayHello();
// 결과
"Lee"
"Hi Lee"
"Hello Person"
class Person {}
const me = new Person();
console.log(me);
class Person {}
const me = Person();
// 결과
"Uncaught TypeError: Class constructor Person cannot be invoked without 'new'"
class Person {
constructor(name) {
// 인스턴스 생성 및 초기화
this.name = name;
}
}
console.log(typeof Person); // function
console.dir(Person);
class Person {
constructor() {}
constructor() {}
}
// 결과
"Uncaught SyntaxError: A class may only have one constructor"
class Person {}
class Person {
constructor(name, address) {
this.name = name;
this.address = address;
}
}
const me = new Person("Lee", "Seoul");
console.log(me);
class Person {
constructor(name) {
this.name = name;
return {};
}
}
const me = new Person("Lee");
console.log(me);
class Person {
constructor(name) {
this.name = name;
}
sayHi() {
console.log(`my name is ${this.name}`);
}
}
const me = new Person("Lee");
me.sayHi();
// 결과
"my name is Lee"
class Person {
constructor(name) {
this.name = name;
}
static sayHi() {
console.log(`my name is ${this.name}`);
}
}
Person.sayHi();
// 결과
"my name is Person"
1. 인스턴스 생성과 this 바인딩
2. 인스턴스 초기화
3. 인스턴스 반환
class Person {
constructor(name) {
// 1. 암묵적으로 인스턴스가 생성되고 this에 바인딩된다.
console.log(this);
console.log(Object.getPrototypeOf(this) === Person.prototype);
// 2. this에 바인딩되어 있는 인스턴스를 초기화한다.
this.name = name;
console.log(this);
// 3. this가 암묵적으로 반환된다.
}
}
const me = new Person("james");
// 결과
Person {}
true
Person {name: 'james'}
class Person {
constructor(name) {
// 인스턴스 프로퍼티
this.name = name;
}
}
const me = new Person("Lee");
console.log(me);
class Person {
constructor(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
get fullName() {
return `${this.firstName} ${this.lastName}`;
}
set fullName(name) {
[this.firstName, this.lastName] = name.split(' ');
}
}
const me = new Person('heedo', 'na');
console.log(`${me.firstName} ${me.lastName}`);
me.fullName = "yijon back";
console.log(me.fullName);
// 결과
"heedo na"
"yijon back"
class Person {
name = "Lee";
}
const me = new Person("Lee");
class Person {
// 클래스 필드 정의
name;
constructor(name) {
this.name = name;
}
getName = function () {
return this.name;
}
}
const me = new Person("Lee");
console.log(me);
console.log(me.getName());
// 결과
Person {name: "Lee"}
"Lee"
인스턴스 프로퍼티를 정의하는 방식
- 인스턴스를 생성할 때
- 외부 초기값으로 클래스 필드를 초기화할 필요가 있다면 constructor에서 인스턴스 프로퍼티를 정의하는 기존 방식을 사용한다.
- 외부 초기값으로 클래스 필드를 초기화할 필요가 없다면 기존 constructor에서 인스턴스 프로퍼티를 정의하는 방식과 클래스 필드 정의 제안 모두 사용할 수 있다.
class Person {
#name = "";
constructor(name) {
this.#name = name;
}
}
const me = new Person("Lee");
console.log(me.#name);
// 결과
"Uncaught SyntaxError: Private field '#name' must be declared in an enclosing class"
class Person {
#name = '';
constructor(name) {
this.#name = name;
}
get getName() {
return this.#name.trim();
}
}
const me = new Person("Lee");
console.log(me.getName);
// 결과
"Lee"
class MyMath {
// static public 필드 정의
static PI = 21 / 7;
// static private 필드 정의
static #num = 10;
// static 메서드
static increment() {
return ++Mymath.#num;
}
console.log(MyMath.PI);
console.log(MyMath.increment());
}