Class에는 data가 들어가지 않고 data가 들어갈 수 있는 틀만 들어있다(정의만 함)
-> 여기에 인스턴스 변수를 넣고 선언한게 Object!
Javascript classes
class 선언은 크게 constructor와 methods로 나눌 수 있는데, constructor는 파이썬의 __init__과 비슷하게 사용될 인수들 선언하는 부분이다
method는 메소드 정의한다
class Person {
//constructor
constructor(name, age) {
//fields
this.name = name;
this.age = age;
}
//methods
speak() {
console.log(`${this.name}: hello!`);
}
}
const comet = new Person('comet', 20);
console.log(comet.name);
console.log(comet.age);
comet.speak;
여기서 getter와 setter에서 기존의 변수명을 그대로 안쓰고 this._변수명을 사용한 이유가 너무 이해가 안됐다...
유튜브 댓글을 보니 나처럼 어려워한 분들도 많았네?
답글로 잘 설명해주신 분들 덕분에 잘 이해할 수 있었다!
게터와 세터의 필요성? 에 관한 예:
class User {
constructor(firstName, lastName, age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
/*
get age() {
return this.age;
}
set age(value) {
this.age = value; // 이렇게 작성하면 무한반복된다..?
}
*/
get age() {
return this._age;
}
set age(value) {
if (value < 0) {
throw Error('age cannot be negative!');
}
this._age = value < 0 ? 0 : value; //삼항연산자로 표현
}
}
const user1 = new User('Steve', 'Job', -1);
console.log(user1.age);
결국 set age(value) 내부의 this.age = age;에서 this.age가 다시 set age(value)를 부르고 그게 반복되면서 에러가 나는 것이라는 내용이다 - 그래서 this._age로 써준다
class Experiment {
publicField = 2;
privateField = 0;
}
const experiment = new Experiment();
console.log(experiment.publicField);
console.log(experiment.privateField); // 내부에서만 보이기에 안뜬다(undefined)
class Article {
static publisher = 'Dream Coding';
constructor(articleNumber) {
this.articleNumber = articleNumber;
}
static printPublisher() {
console.log(Article.publisher);
}
}
const article1 = new Article();
const article2 = new Article();
console.log(article1.publiser);
//static은 class 자체에 선언되어 있기에 각각의 obj에서는 undefined됨(값이 지정되지않음)
console.log(Article.publiser);
// 그래서 이렇게 class.으로 직접 해주어야 함
Article.printPublisher(); //요것도 static이기에 Article.으로 해줌
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(); //super를 통해 부모의 draw도 불러올 수 이따!
console.log('🔻');
}
// 오버라이딩 - 삼각형은 넓이 구할 때 /2를 해야하니 그부분만 수정 가능
getArea() {
return (this.width * this.height) / 2;
}
}
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());
저 삼각형 어디서 찾았는지 궁금한 분들은
윈도우키 + .(온점) 단축키 누르면 됩니닷!
퀴즈타임!!
console.log(rectangle instanceof Rectangle);
console.log(triangle instanceof Rectangle);
console.log(triangle instanceof Triangle);
console.log(triangle instanceof Shape);
console.log(t instanceof Object);
정답은!!!
.
.
.
.
.
tfttt
이상!