๐ Class
- class๋ ํจ์์ ํ ์ข ๋ฅ์ด๋ค.
- class ์ ์๋ ํญ์ "strict mode"๋ค.
- class ์ ์ธ์ ํจ์ ์ ์ธ๊ณผ ๋ฌ๋ฆฌ ํธ์ด์คํ ์ ๋์์ด ์๋๋ค.
- ์ ์ธํ class๋ ์ฌ์ ์ธ ํ ์ ์๋ค.
- class์ ๋ฉ์๋๋ ์ด๊ฑฐํ ์ ์๋ค. : non-enumerable
๐ constructor
- ํด๋์ค์ ์ธ์คํด์ค ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ด๊ธฐํํ๋ ํน๋ณํ ์์ฑ์ ๋ฉ์๋
- new์ ์ํด ์๋์ผ๋ก ํธ์ถ๋๋ฏ๋ก ํน๋ณํ ์ ์ฐจ ์์ด ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํ ํ ์ ์๋ค.
- class ์์ ํ ๊ฐ๋ง ์กด์ฌํ ์ ์๋ค.
https://ko.javascript.info/class
class User {
constructor(name) { this.name = name; }
sayHi() { alert(this.name); }
}
// ํด๋์ค๋ ํจ์์
๋๋ค.
alert(typeof User); // function
// ์ ํํ๋ ์์ฑ์ ๋ฉ์๋์ ๋์ผํฉ๋๋ค.
alert(User === User.prototype.constructor); // true
// ํด๋์ค ๋ด๋ถ์์ ์ ์ํ ๋ฉ์๋๋ User.prototype์ ์ ์ฅ๋ฉ๋๋ค.
alert(User.prototype.sayHi); // alert(this.name);
// ํ์ฌ ํ๋กํ ํ์
์๋ ๋ฉ์๋๊ฐ ๋ ๊ฐ์
๋๋ค.
alert(Object.getOwnPropertyNames(User.prototype)); // constructor, sayHi
- User๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง ํจ์๋ฅผ ๋ง๋ญ๋๋ค. ํจ์ ๋ณธ๋ฌธ์ ์์ฑ์ ๋ฉ์๋ constructor์์ ๊ฐ์ ธ์ต๋๋ค. ์์ฑ์ ๋ฉ์๋๊ฐ ์์ผ๋ฉด ๋ณธ๋ฌธ์ด ๋น์์ง ์ฑ๋ก ํจ์๊ฐ ๋ง๋ค์ด์ง๋๋ค.
- sayHi๊ฐ์ ํด๋์ค ๋ด์์ ์ ์ํ ๋ฉ์๋๋ฅผ User.prototype์ ์ ์ฅํฉ๋๋ค.
new User๋ฅผ ํธ์ถํด ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ , ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ํจ์์ prototype ํ๋กํผํฐ์์ ์ค๋ช ํ ๊ฒ์ฒ๋ผ ๋ฉ์๋๋ฅผ prototype ํ๋กํผํฐ๋ฅผ ํตํด ๊ฐ์ ธ์ต๋๋ค. ์ด ๊ณผ์ ์ด ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด์์ ํด๋์ค ๋ฉ์๋์ ์ ๊ทผํ ์ ์์ต๋๋ค.
๐ class ์์ - extends, super
๐ extends
class Animal {
constructor(name) {
this.speed = 0;
this.name = name;
}
run(speed) {
this.speed = speed;
alert(`${this.name} ์/๋ ์๋ ${this.speed}๋ก ๋ฌ๋ฆฝ๋๋ค.`);
}
stop() {
this.speed = 0;
alert(`${this.name} ์ด/๊ฐ ๋ฉ์ท์ต๋๋ค.`);
}
}
let animal = new Animal("๋๋ฌผ");
class Rabbit extends Animal {
hide() {
alert(`${this.name} ์ด/๊ฐ ์จ์์ต๋๋ค!`);
}
}
let rabbit = new Rabbit("ํฐ ํ ๋ผ");
rabbit.run(5); // ํฐ ํ ๋ผ ์/๋ ์๋ 5๋ก ๋ฌ๋ฆฝ๋๋ค.
rabbit.hide(); // ํฐ ํ ๋ผ ์ด/๊ฐ ์จ์์ต๋๋ค!
- extends๋ฅผ ์ฌ์ฉํ์ฌ Animal ๋ฉ์๋๋ฅผ ์์๋ฐ์ ์ฌ์ฉํ ์ ์๋ค.
- Rabbit์์ Animal์ ์๋ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ ์ ์๋ค. ๋ง์ฝ ๋ฎ์ด์ฐ๊ณ ๋ ํ ๋ค์ Animal์ ์๋ ๋ฉ์๋๊ฐ ํ์ํ๋ค๋ฉด super๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
๐ super
- super.method๋ ๋ถ๋ชจ ํด๋์ค์ ์ ์๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
- ์์ ์์ฑ์ ๋ด๋ถ์์๋ง ์ฌ์ฉํ ์ ์๋ค.
class Animal {
constructor(name) {
this.speed = 0;
this.name = name;
}
run(speed) {
this.speed = speed;
alert(`${this.name}๊ฐ ์๋ ${this.speed}๋ก ๋ฌ๋ฆฝ๋๋ค.`);
}
stop() {
this.speed = 0;
alert(`${this.name}๊ฐ ๋ฉ์ท์ต๋๋ค.`);
}
}
class Rabbit extends Animal {
hide() {
alert(`${this.name}๊ฐ ์จ์์ต๋๋ค!`);
}
stop() {
super.stop(); // ๋ถ๋ชจ ํด๋์ค์ stop์ ํธ์ถํด ๋ฉ์ถ๊ณ ,
this.hide(); // ์จ์ต๋๋ค.
}
}
let rabbit = new Rabbit("ํฐ ํ ๋ผ");
rabbit.run(5); // ํฐ ํ ๋ผ๊ฐ ์๋ 5๋ก ๋ฌ๋ฆฝ๋๋ค.
rabbit.stop(); // ํฐ ํ ๋ผ๊ฐ ๋ฉ์ท์ต๋๋ค. ํฐ ํ ๋ผ๊ฐ ์จ์์ต๋๋ค!
๐ ์์ ํด๋์ค์ ์์ฑ์์์ this๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ๋ฐ๋์ super๋ฅผ ํธ์ถํด์ผํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
class Rabbit extends Animal {
constructor(name, earLength) {
this.speed = 0;
this.name = name;
this.earLength = earLength;
}
hide() {
alert(`${this.name} ์ด/๊ฐ ์จ์์ต๋๋ค!`);
}
}
Rabbit์์ name, earLength๋ฅผ ์ง์ ํ๋ ์์ฑ์ ๋ฃ์ผ๋ฉด ์ค๋ฅ๊ฐ๋๋ค. -> super๋ฅผ ํธ์ถํ์ง ์์์
- ์ผ๋ฐ ํด๋์ค์ ์์ฑ์ ํจ์์ ์์๋ฐ์ ํด๋์ค์ ์์ฑ์ ํจ์์ ์ฐจ์ด๋ new์ ํจ๊ป ๋๋ฌ๋๋ค.
1. ์ผ๋ฐ ํด๋์ค๊ฐ new์ ํจ๊ป ์คํ๋๋ฉด, ๋น ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง๊ณ this์ ์ด ๊ฐ์ฒด๋ฅผ ํ ๋นํ๋ค.
2. ์์ ํด๋์ค์ ์์ฑ์ ํจ์๊ฐ ์คํ๋๋ฉด, ์์ ํด๋์ค์ ์์ฑ์ ํจ์๋ ๋น ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ this์ ์ด ๊ฐ์ฒด๋ฅผ ํ ๋นํ๋ ์ผ์ ๋ถ๋ชจ ํด๋์ค์ ์์ฑ์๊ฐ ์ฒ๋ฆฌํด์ฃผ๊ธธ ๊ธฐ๋ํ๋ค.
- ์ด๋ฐ ์ฐจ์ด ๋๋ฌธ์ ์์ ํด๋์ค์ ์์ฑ์์์๋ super๋ฅผ ํธ์ถํด ๋ถ๋ชจ ์์ฑ์๋ฅผ ์คํํด ์ฃผ์ด์ผ ํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด this๊ฐ ๋ ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง์ง ์์ ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
class Animal {
constructor(name) {
this.speed = 0;
this.name = name;
}
// ...
}
class Rabbit extends Animal {
constructor(name, earLength) {
super(name);
this.earLength = earLength;
}
// ...
}
// ์ด์ ์๋ฌ ์์ด ๋์ํฉ๋๋ค.
let rabbit = new Rabbit("ํฐ ํ ๋ผ", 10);
alert(rabbit.name); // ํฐ ํ ๋ผ
alert(rabbit.earLength); // 10
์ถ์ฒ ๋ฐ ์ฐธ๊ณ |
https://ko.javascript.info/class-inheritance |
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/class |
https://uiyoji-journal.tistory.com/101 |
'Javascript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JS] "?." ์ต์ ๋ ์ฒด์ด๋ ์ฐ์ฐ์ (Optional chaining) (0) | 2022.08.03 |
---|---|
[JS] promise, async, await ์ฐ์ง ์๊ณ parallel, waterfall ๊ตฌํํ๊ธฐ (0) | 2022.06.03 |
[JS] Promise, Await ๋น๋๊ธฐ์ ๋ํด ์์๋ณด๊ธฐ (0) | 2022.06.01 |
[JS] JavaScript์ ํ์ ๊ฒ์ฌ (0) | 2022.05.29 |
[JS] ์์๋ณ์๋ฅผ ์ค์ฌ์ผ ํ๋ ์ด์ (ํด๋ฆฐ ์ฝ๋) (0) | 2022.05.27 |