클래스에 대한 내용은 다음의 링크를 참고하였다. 강의노트를 보며 공부하도록 하자.
https://github.com/dream-ellie/learn-javascript
1. getter and setter에서 변수명에 ._를 붙이는 이유
this.age는 getter를 호출하고 = age는 setter를 호출한다. 여기서 setter의 내부를 들여다 보면 내부의 문장은 setter를 호출하고 호출하면 문장을 실행시켜 setter를 다시 호출하게 된다. 이 과정을 무한반복하다 보니 stack size 에러가 나온다.
이를 방지하기 위해 변수명에 ._를 붙인다. (이는 관행적인 것이지, 꼭 저렇게 쓸 필요는 없다)
'use strict';
// Object-oriendted programming
// class: template
// object: instance of a class
// JavaScript classes
// - introduced in ES6
// - syntactical sugar over prototype-based inheritance
// 1. Class declarations
class Person {
// constructor
constructor(name, age) {
// fields
this.name = name;
this.age = age;
}
// methods
speak() {
console.log(`${this.name}: hello!`);
}
}
const ellie = new Person('ellie', 20);
console.log(ellie.name);
console.log(ellie.age);
ellie.speak();
// 2. Getter and setters
class User {
constructor(firstName, lastName, age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
get age() {
return this._age;
}
set age(value) {
// if (value < 0) {
// throw Error('age can not be negative');
// }
this._age = value < 0 ? 0 : value;
}
}
const user1 = new User('Steve', 'Job', -1);
console.log(user1.age);
// 3. Fields (public, private)
// Too soon!
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/Class_fields
class Experiment {
publicField = 2;
#privateField = 0;
}
const experiment = new Experiment();
console.log(experiment.publicField);
console.log(experiment.privateField);
// 4. Static properties and methods
// Too soon!
class Article {
static publisher = 'Dream Coding';
constructor(articleNumber) {
this.articleNumber = articleNumber;
}
static printPublisher() {
console.log(Article.publisher);
}
}
const article1 = new Article(1);
const article2 = new Article(2);
console.log(Article.publisher);
Article.printPublisher();
// 5. Inheritance (상속, 다형성, 오버라이딩에 대한 내용)
// a way for one class to extend another class.
class Shape {
constructor(width, height, color) {
this.width = width;
this.height = height;
this.color = color;
}
draw() {
console.log(`drawing ${this.color} color!`);
}
getArea() {
return this.width * this.height;
}
}
class Rectangle extends Shape {}
class Triangle extends Shape {
draw() {
super.draw();
console.log('🔺');
}
getArea() {
return (this.width * this.height) / 2;
}
toString() {
return `Triangle: color: ${this.color}`;
}
}
const rectangle = new Rectangle(20, 20, 'blue');
rectangle.draw();
console.log(rectangle.getArea());
const triangle = new Triangle(20, 20, 'red');
triangle.draw();
console.log(triangle.getArea());
// 6. Class checking: instanceOf
console.log(rectangle instanceof Rectangle);
console.log(triangle instanceof Rectangle);
console.log(triangle instanceof Triangle);
console.log(triangle instanceof Shape);
console.log(triangle instanceof Object);
console.log(triangle.toString());
let obj = { value: 5 };
function change(value) {
value.value = 7;
}
change(obj);
console.log(obj);
'WEB > JavaScript' 카테고리의 다른 글
[Javascript] json (0) | 2023.08.11 |
---|---|
[JavaScript] var를 사용하면 안되는 이유 (0) | 2023.07.31 |
[JavaScript] html에서 js파일을 가장 효율적으로 포함하는 방법 (0) | 2023.07.27 |
[JavaScript] Array.map() 메소드 (0) | 2023.01.17 |
[JavaScript] 객체 (3) | 2022.12.31 |