์ถ์ฒ: mdn - classes
class๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํ ํ
ํ๋ฆฟ์ด๋ค.
class๋ "ํน๋ณํ ํจ์"
ํจ์๋ฅผ ํจ์ํํ์๊ณผ ํจ์ ์ ์ธ์ผ๋ก ์ ์ํ ์ ์๋ฏ, class ํํ์๊ณผ class ์ ์ธ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ ์ํ ์ ์๋ค.
ํด๋์ค๋ ํธ์ด์คํ ๋ ๋ ์ด๊ธฐํ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ ์ธ ์ ํธ์ถํ ๊ฒฝ์ฐ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
let avante = new Car('hyundai', 'avante', 'black'); // Reference Error
class Car {
//
}
class ํค์๋ + ์ฃผ๋ก ๋๋ฌธ์๋ก ์์ํ๋ ํด๋์ค๋ฅผ ์ ์ํ ๋จ์ด
class Car {
// ์์ฑ ์ ์
constructor(brand, name, color) {
this.brand = brand;
this.name = name;
this.color = color;
}
// ๋ฉ์๋ ์ ์
drive() {
//
}
}
let Car = class {
// unnamed class
}
console.log(Car.name);
// ์ถ๋ ฅ: "Car"
let Car = class Carr {
// named
}
console.log(Car.name);
// ์ถ๋ ฅ: "Carr"
ํด๋์ค ๋ณธ๋ฌธ(Class body)์ ๋ค์ ์ฝ๋์ฒ๋ผ ์ค๊ดํธ๋ก ๋ฌถ์ฌ ์๋ ์์ชฝ ๋ถ๋ถ์ด๋ค.
class Car {
//
}
ํด๋์ค ๋ณธ๋ฌธ์ Strict mode์์ ์คํ๋๋ค.
class๋ก ์์ฑ๋ ๊ฐ์ธ๋ฅผ ์์ฑํ๊ณ ์ด๊ธฐํํ๊ธฐ ์ํ ํน์ํ ๋ฉ์๋
super
ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์์class Rectangle {
constructor(height, width) {
this.height = height;
this.width = width;
}
// Getter
get area() {
return this.calcArea();
}
// ๋ฉ์๋
calcArea() {
return this.height * this.width;
}
}
const square = new Rectangle(10, 10);
console.log(square.area); // 100
ํด๋์ค ๋ณธ๋ฌธ์ Strict mode์์ ์คํ๋๊ธฐ ๋๋ฌธ์ this ๋ฐ์ธ๋ฉ๋ Strict mode๋ฅผ ๋ฐ๋ฅธ๋ค. (์ ์ญ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ์ง ์์)
class Animal {
speak() {
return this;
}
static eat() {
return this;
}
}
let obj = new Animal();
obj.speak(); // the Animal object
// call, apply, bind๋ฅผ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ ์ ์์
let speak = obj.speak;
speak(); // undefined
Animal.eat() // class Animal
let eat = Animal.eat;
eat(); // undefined
static ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋์ค์ ์ธ์คํด์ค์์๋ ํธ์ถํ ์ ์๋ค.
์ ์ ๋ฉ์๋๋ ์ฃผ๋ก ์ ํธ๋ฆฌํฐ ํจ์๋ฅผ ์์ฑํ๋๋ฐ ์ฌ์ฉํ๋ฉฐ, ์ ์ ์์ฑ์ ๋ณต์ ํ ํ์๊ฐ ์๋ ๊ธฐํ ๋ฐ์ดํฐ์ ์ ์ฉํ๋ค.
class Car {
constructor(brand, name, color) {
this.brand = brand;
this.name = name;
this.color = color;
}
// ์ ์ ์์ฑ ์ ์
static privateValue = "privateValue";
// ์ ์ ๋ฉ์๋ ์ ์
static selfRepair() {
//
}
}
let avante = new Car('hyundai', 'avante', 'black');
console.log(avante.privateValue) // undefined
console.log(avante.selfRepair()) // undefined
console.log(Car.privateValue); // privateValue
์ธ์คํด์ค ์์ฑ์ ๋ฐ๋์ ํด๋์ค ๋ฉ์๋ ๋ด์ ์ ์๋์ด์ผ ํ๋ฉฐ,
์ ์ (ํด๋์ค ์ฌ์ด๋) ์์ฑ๊ณผ ํ๋กํ ํ์
๋ฐ์ดํฐ ์์ฑ์ ๋ฐ๋์ ํด๋์ค ์ ์ธ๋ถ ๋ฐ๊นฅ์ชฝ์ ์ ์๋์ด์ผ ํฉ๋๋ค.
์ถ์ฒ: velog - Class Public & Private field MDN ๋ด์ฉ ์ ๋ฆฌ
Public fields
static
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ธํ ๋ณ์ ๋๋ ๋ฉ์๋static name = 'name is only value'
Private fields
private static
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ธํ ๋ณ์ ๋๋ ๋ฉ์๋private static age = 0
ํด๋์ค ๋ด๋ถ์์๋ง ์ฌ์ฉํ๊ธฐ ์ํ ์์ฑ๊ณผ ๋ฉ์๋๋ฅผ private
ํค์๋๋ฅผ ํตํด ๊ตฌํํ ์ ์์ง๋ง ์ง์ํ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์ ์ด ๋ง์ด ์ฐ์ด์ง ์์
ํด๋์ค ์์
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
// extends ์์
class Dog extends Animal {
constructor(name) {
// super class ์์ฑ์๋ฅผ ํธ์ถํ์ฌ name ๋งค๊ฐ๋ณ์ ์ ๋ฌ
super(name);
}
speak() {
console.log(`${this.name} barks.`);
}
}
let d = new Dog('Mitzie');
d.speak(); // Mitzie barks.