์๋ฐ์คํฌ๋ฆฝํธ๋ ํด๋์ค ๊ธฐ๋ฐ์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ์๋์ง๋ง ํ๋กํ ํ์ ๊ธฐ๋ฐ์ ์์ฃผ ์ ์ฐํ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ๋ก ๊ฐ์ฒด ์งํฅ ์ธ์ด์ ์์๊ณผ ์บก์ํ ๋ฑ์ ์ถ์์ ๊ฐ๋ ๋ ๊ตฌํํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด ์ฅ์์ ES6์ ๋ฑ์ฅํ ํด๋์ค(Class)์ ๋ํด ์์๋ด ๋๋ค.
ES6์ ํด๋์ค๊ฐ ํ๋กํ ํ์ ๊ธฐ๋ฐ ๊ฐ์ฒด ์งํฅ ๋ชจ๋ธ์ ํ์งํ ๊ฒ์ด ์๋๋๋ค. ํด๋์ค๋ ํจ์์ด๊ธฐ ๋๋ฌธ์ด์ง์.
์ฐ๋ฆฌ๋ ๊ธฐ์กด ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๊ตฌํํ ๋, ์์ฑ์ ํจ์์ ํ๋กํ ํ์ , ํด๋ก์ ๋ฅผ ์ด์ฉํด์์ต๋๋ค.
var Person = (function () {
// Constructor, ์์ฑ์ ํจ์
function Person(name) {
this._name = name;
}
// public method
Person.prototype.sayHi = function () {
console.log('HELLO! ' + this._name);
};
// return constructor
return Person;
}());
// ์ธ์คํด์ค ์์ฑ
var me = new Person('Amy');
me.sayHi(); // HELLO! Amy
console.log(me instanceof Person); // true
์ด๋ฅผ ํด๋์ค๋ก ๊ตฌํํด๋ณผ๊น์?
class Person {
// constructor, ์์ฑ์
constructor(name) {
this._name = name;
}
sayHi() {
console.log(`HELLO! ${this._name}`);
}
}
// ์ธ์คํด์ค ์์ฑ
const me = new Person('Amy');
me.sayHi(); // HELLO! Amy
console.log(me instanceof Person); // true
๋์ผํ ๋์์ ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ฃ ? ๊ตฌ๋ฌธ๋ ๋จ์ํ๋์์ต๋๋ค. ์ฆ, ES6์ ํด๋์ค๋ ํจ์์ด๋ฉฐ ๊ธฐ์กด ํ๋กํ์ ๊ธฐ๋ฐ ํจํด์ ๋ฌธ๋ฒ์ ์คํ(Syntactic sugar) ์ด ๋ฉ๋๋ค. ๋จ, ํด๋์ค์ ์์ฑ์ ํจ์๊ฐ ๋์ผํ๊ฒ ๋์ํ์ง๋ ์์ผ๋๊น ์ฃผ์(์ผ๊ฐ์์ ์ด๋ฐ ์ด์ ๋ก ํด๋์ค๋ฅผ ๋ฌธ๋ฒ์ ์คํ์ผ๋ก ์ธ์ ํ์ง ์์์)ํ์ธ์.
ํด๋์ค๋ class ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ํ๋ฉฐ, ํ์ค์นผ ์ผ์ด์ค๋ก ์์ฑํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค.
ํด๋์ค๋ฅผ ์ด๋ป๊ฒ ์์ฑํ๋์ง๋ ์ธ๊ธํ์ง ์๊ฒ ์ต๋๋ค. ๊ธฐ์กด ํ๋กํ ํ์ ๊ณผ ์ ์ฌํ๊ธฐ ๋๋ฌธ์ด์ฃ . ์ด ์ฅ์์๋ ํด๋์ค์ ํน์ง๋ง ์ง๊ณ ๋์ด๊ฐ๋๋ค.
- ํด๋์ค๋ ํด๋์ค ์ ์ธ๋ฌธ ์ด์ ์ ์ฐธ์กฐํ ์ ์์ต๋๋ค.
- ์ด๋ let, const์ ๊ฐ์ต๋๋ค. ์ฆ, ํธ์ด์คํ ๋๋ let, const ๋ณ์์ฒ๋ผ ์ ์ธ๋ฌธ ์ด์ ์ ์ผ์์ ์ฌ๊ฐ์ง๋(TDZ)์ ๋น ์ง๊ธฐ ๋๋ฌธ์ด์ฃ .
- ํธ์ด์คํ ์ var, let, const, function, function*, class ํค์๋๋ฅผ ์ฌ์ฉํ ๋ชจ๋ ์ ์ธ๋ฌธ์ ์ ์ฉ๋ฉ๋๋ค.
- ํํ์์ผ๋ก๋ ํด๋์ค๋ฅผ ์ ์ํ ์ ์์ผ๋ฉฐ ์ต๋ช
์ผ ์ ์์ต๋๋ค.
const NamedClass = class UnNamedClass {}; const name = new NamedClass(); console.log(name); // UnNamedClass {} new UnNamedClass(); // ReferenceError: UnNamedClass is not defined
- ํด๋์ค๊ฐ ํ ๋น๋ ๋ณ์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๊ธฐ๋ช ํด๋์ค๋ก ์์ฑํ๋ค๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค. ๊ทธ ์ด์ ๋ ํด๋์ค ํํ์์ ์ฌ์ฉํ ์ด๋ฆ์ ์ธ๋ถ ์ฝ๋์์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด์ฃ .
- ์์ฑ์ ํจ์์ ๋ง์ฐฌ๊ฐ์ง๋ก new ์ฐ์ฐ์์ ํจ๊ป ํด๋์ค๋ฅผ ํธ์ถํ๋ฉด ํด๋์ค์ ์ธ์คํด์ค๊ฐ ์์ฑ๋ฉ๋๋ค.
class NamedClass {}; const name = NamedClass(); // TypeError: Class constructor NamedClass cannot be invoked without 'new'
- ํด๋์ค๋ฅผ new ์ฐ์ฐ์ ์์ด ํธ์ถํ๋ฉด ํ์ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
- ํด๋์ค๋ ํด๋์ค ๋ด๋ถ์ ์บก์ํ๋ ๋ณ์, ํด๋์ค ํ๋(Class Field) ๋ฅผ ๊ฐ์ง๋๋ค.
- ๋ฐ์ดํฐ ๋ฉค๋ฒ, ๋ฉค๋ฒ ๋ณ์๋ผ๊ณ ๋ ๋ถ๋ฅด๋ฉฐ ์ธ์คํด์ค์ ํ๋กํผํฐ ํน์ ์ ์ ํ๋กํผํฐ๊ฐ ๋ ์ ์์ต๋๋ค.
- this์ ์ถ๊ฐํ ํ๋กํผํฐ๋ฅผ ํด๋์ค ๊ธฐ๋ฐ ๊ฐ์ฒด์งํฅ ์ธ์ด์์ ํด๋์ค ํ๋๋ผ๊ณ ์ง์นญํ์ฃ .
- constructor๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ํด๋์ค ํ๋๋ฅผ ์ด๊ธฐํํ๊ธฐ ์ํ ๋ฉ์๋์
๋๋ค.
class NamedClass {}; const name = NamedClass(); // TypeError: Class constructor NamedClass cannot be invoked without 'new' // NamedClass๋ ์์ฑ์ ํจ์(constructor)์ ๋๋ค. console.log(Object.getPrototypeOf(name).constructor === NamedClass); // true
- new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถ๋๋ ๊ฒ์ด constructor๋ก ํ๋ผ๋ฏธํฐ์ ์ ๋ฌํ ๊ฐ์ ํด๋์ค ํ๋์ ํ ๋นํ ์ ์์ต๋๋ค.
- constructor๋ ์ธ์คํด์ค์ ์์ฑ๊ณผ ๋์์ ํด๋์ค ํ๋์ ์์ฑ๊ณผ ์ด๊ธฐํ๋ฅผ ์คํํฉ๋๋ค.
- constructor๋ ํด๋์ค ๋ด์ ํ ๊ฐ๋ง ์กด์ฌํ๋ฉฐ 2๊ฐ ์ด์์ผ ๊ฒฝ์ฐ ๋ฌธ๋ฒ ์๋ฌ(SyntaxError)๊ฐ ๋ฐ์ํฉ๋๋ค.
- constructor๋ฅผ ์๋ตํ๋ฉด ํด๋์ค์ constructor() {}, ์ฆ ๋น ๊ฐ์ฒด๋ฅผ ํฌํจํ๋ ๊ฒ์ฒ๋ผ ๋์ํฉ๋๋ค.
-
ํด๋์ค ํ๋์๋ ๋ฉ์๋๋ง ์ ์ธํ ์ ์์ต๋๋ค.
class NamedClass { name = ''; // SyntaxError // ํด๋์ค ํ๋์ ์ ์ธ๊ณผ ์ด๊ธฐํ๋ ๋ฐ๋์ constructor์์ ์ค์ํฉ๋๋ค. constructor(name) { this.name = name; } }
ํ์ฌ๋ ์ ์์ ์ผ๋ก ๋์ํ๋๋ฐ, TC39 ํ๋ก์ธ์ค์ stage 3(candidate) ๋จ๊ณ์ ์๋ ํด๋์ค ๋ชธ์ฒด์์ ์ง์ ์ธ์คํด์ค ํ๋๋ฅผ ์ ์ธํ๊ณ private ์ธ์คํด์ค ํ๋๋ฅผ ์ ์ธํ ์ ์๋ ํ๋กํฌ์ (Class field declarations proposal)์ ํ๋ ์ ์๋ฅผ ์ต์ ๋ธ๋ผ์ฐ์ ์ ์ต์ Node.js๊ฐ ๊ตฌํํ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
- constructor ๋ด๋ถ์์ ์ ์ธํ ํด๋์ค ํ๋๋ ํด๋์ค๊ฐ ์์ฑํ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํค๋ this์ ๋ฐ์ธ๋ฉ๋๋ฉฐ, ํด๋์ค ์ธ์คํด์ค๋ฅผ ํตํด ์ธ๋ถ์์ ์ง์ ์ฐธ์กฐํ ์ ์์ต๋๋ค. publicํ ๋ฉค๋ฒ๋ก์ ์ทจ๊ธ๋๋ ๊ฒ์ด์ฃ .
์ต์ ๋ธ๋ผ์ฐ์ ์ Node.js 12๋ฒ์ ์ด์์์๋ ์ฌ๋ฌ ์์ฑ๋ค์ ์ง์ํ๊ณ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ์ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํด์ฃผ์ธ์.
- getter/setter๋ก ํด๋์ค ํ๋์ ๊ฐ์ ์ฐธ์กฐํ๊ฑฐ๋, ์กฐ์ํ ์ ์์ต๋๋ค.
- ์ฐ๋ฆฌ๊ฐ ์๊ณ ์๋ ๊ทธ ์ ๊ทผ์ ํ๋กํผํฐ๊ฐ ๋ง์ต๋๋ค.
- ์ ์ (static) ๋ฉ์๋๋ฅผ ์ ์ํ ์ ์์ผ๋ฉฐ, ํด๋์ค ์ธ์คํด์ค๊ฐ ์๋๋ผ ํด๋์ค ์ด๋ฆ์ผ๋ก ํธ์ถํ ์ ์์ต๋๋ค.
- ํด๋์ค ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์์๋ ๋ฉ๋๋ค. ์ด๋ ์ ์ ๋ฉ์๋์ this๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
class NamedClass { constructor(prop) { this.prop = prop; } static staticMethod() { // ์ ์ ๋ฉ์๋๋ this๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. // ์ ์ ๋ฉ์๋ ๋ด๋ถ์์ this๋ ํด๋์ค์ ์ธ์คํด์ค๊ฐ ์๋ ํด๋์ค ์์ ์ ๊ฐ๋ฆฌํต๋๋ค. return 'staticMethod'; } prototypeMethod() { return this.prop; } } // ์ ์ ๋ฉ์๋๋ ํด๋์ค ์ด๋ฆ์ผ๋ก ํธ์ถํฉ๋๋ค. console.log(NamedClass.staticMethod()); const name = new NamedClass(123); // ์ ์ ๋ฉ์๋๋ ์ธ์คํด์ค๋ก ํธ์ถํ ์ ์์ต๋๋ค. console.log(name.staticMethod()); // Uncaught TypeError: NamedClass.staticMethod is not a function
- ์ด์ ๋ ๊ธฐ์กด ํ๋กํ ํ์
๊ธฐ๋ฐ์ ๋ฌธ๋ฒ์ ์คํ์ด ํด๋์ค์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ์ ์์ ๋ฅผ ES5๋ก ํํํด ๋ณผ๊น์?
var NamedClass = (function () { // ์์ฑ์ ํจ์ function NamedClass(prop) { this.prop = prop; } NamedClass.staticMethod = function () { return 'staticMethod'; }; NamedClass.prototype.prototypeMethod = function () { return this.prop; }; return NamedClass; }()); var name = new NamedClass(123); console.log(name.prototypeMethod()); // 123 console.log(NamedClass.staticMethod()); // staticMethod console.log(name.staticMethod()); // Uncaught TypeError: name.staticMethod is not a function
- prototype ํ๋กํผํฐ๋ ํจ์ ๊ฐ์ฒด๊ฐ ์์ฑ์๋ก ์ฌ์ฉ๋ ๋, ์ด ํจ์๋ฅผ ํตํด ์์ฑ๋ ๊ฐ์ฒด์ ๋ถ๋ชจ ์ญํ ์ ํ๋ ํ๋กํ ํ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ฏ๋ก ์ ์ ๋ฉ์๋์ธ staticMethod๋ ์์ฑ์ ํจ์ NamedClass์ ๋ฉ์๋(ํจ์๋ ๊ฐ์ฒด์ด๋ฏ๋ก ๋ฉ์๋๋ฅผ ๊ฐ์ง ์ ์์ด์)์ด๊ณ , ์ผ๋ฐ ๋ฉ์๋์ธ prototypeMethod๋ ํ๋กํ ํ์ ๊ฐ์ฒด NamedClass.prototype์ ๋ฉ์๋์ ๋๋ค. ๋ฐ๋ผ์ staticMethod๋ name์์ ํธ์ถํ ์ ์๋ ๊ฒ์ด์ฃ !
- extends ํค์๋๋ก ํด๋์ค๋ฅผ ์์(Class Inheritance) ํ ์ ์์ต๋๋ค.
- ์ค๋ฒ๋ผ์ด๋ฉ(Overriding), ์ค๋ฒ๋ก๋ฉ(Overloading)์ด ํ๋กํ ํ์ ์ฒด์ธ์ ์ํด ๊ตฌํ๋ ์ ์์ต๋๋ค.
- super() ํค์๋๋ก ๋ถ๋ชจ ํด๋์ค๋ฅผ ์ฐธ์กฐ(Reference)ํ๊ฑฐ๋ ๋ถ๋ชจ ํด๋์ค์ constructor๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
- ์์ ํด๋์ค์์ constructor๋ฅผ ์ ์ธํ์ง ์์ผ๋ฉด ๋ถ๋ชจ์ constructor๋ฅผ ๋ฐ๋ผ๋ด ๋๋ค.
- ๊ทธ๋ฌ๋ ์์ ํด๋์ค์์ constructor๋ฅผ ์ ์ธํ์์๋ super() ํค์๋๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด ์ฐธ์กฐ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
super ํค์๋๋ ์์ด ๋ง์ ๋จ์์ ๋ถ๋ฆฌํฉ๋๋ค.
super ํค์๋๋ ํจ์์ฒ๋ผ ํธ์ถํ๊ฑฐ๋ this์ ๊ฐ์ด ์๋ณ์์ฒ๋ผ ์ฐธ์กฐํ ์ ์๋ ํน์ํ ํค์๋์ ๋๋ค.
super ํค์๋๋ ์๋์ ๊ฐ์ด ๋์ํฉ๋๋ค.
- super๋ฅผ ํธ์ถํ๋ฉด ์ํผ ํด๋์ค์ constructor()๋ฅผ ํธ์ถํฉ๋๋ค.
- super๋ฅผ ์ฐธ์กฐํ๋ฉด ์ํผ ํด๋์ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
์์ธํ ์์๋ณผ๊น์?
new ์ฐ์ฐ์์ ํจ๊ป ์๋ธ ํด๋์ค๋ฅผ ํธ์ถํ๋ฉด์ ์ ๋ฌํ ์ธ์๋ super ํธ์ถ์ ํตํด ์ํผ ํด๋์ค์ constructor()์ ์ ๋ฌ๋ฉ๋๋ค.
์ํผ ํด๋์ค์์ ์ถ๊ฐํ ํ๋กํผํฐ์ ์๋ธ ํด๋์ค์์ ์ถ๊ฐํ ํ๋กํผํฐ๋ฅผ ๊ฐ๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค๋ฉด ์๋ธ ํด๋์ค์ constructor๋ฅผ ์๋ตํ ์ ์์ต๋๋ค.
๋ํ new ์ฐ์ฐ์์ ํจ๊ป ์๋ธ ํด๋์ค๋ฅผ ํธ์ถํ๋ฉด์ ์ ๋ฌํ ์ธ์๋ฅผ ์ํผ ํด๋์ค์ constructor์ super ํค์๋๋ฅผ ํตํ์ฌ ์ ๋ฌํ ์ ์์ต๋๋ค.
// ์ํผ ํด๋์ค
class Base {
constructor(a, b) { // โฃ
this.a = a;
this.b = b;
}
}
// ์๋ธ ํด๋์ค
class Derived extends Base {
// ์๋ฌต์ ์ผ๋ก constructor๊ฐ ์ ์๋์ง๋ง ์ง์ ์
๋ ฅํ ์ ์์ต๋๋ค.
// constructor(...args) { super(...args); }
constructor(a, b, c) {
super(a, b);
this.c = c;
}
}
const derived = new Derived(1, 2, 3);
console.log(derived); // Derived {a: 1, b: 2, c: 3}
์ด ๋ ์ฃผ์์ฌํญ์ ์๋์ ๊ฐ์ต๋๋ค.
- ์๋ธ ํด๋์ค์์ constructor๋ฅผ ์๋ตํ์ง ์๋ ๊ฒฝ์ฐ, ์๋ธ ํด๋์ค์ constructor์์ ๋ฐ๋์ super๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค.
class Base {} class Derived extends Base { constructor() { // ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor console.log('constructor call'); } } const derived = new Derived();
- ์๋ธ ํด๋์ค์ constructor์์ super๋ฅผ ํธ์ถํ๊ธฐ ์ ์ this๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค.
class Base {} class Derived extends Base { constructor() { // ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor this.a = 1; super(); } } const derived = new Derived(1);
- super๋ ๋ฐ๋์ ์๋ธ ํด๋์ค์ constructor์์๋ง ํธ์ถํด์ผ ํฉ๋๋ค. ์๋ธ ํด๋์ค๊ฐ ์๋ ํด๋์ค์ constructor๋ ํจ์์์ super๋ฅผ ํธ์ถํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํด์.
// ์ํผ ํด๋์ค class Base { constructor(name) { this.name = name; } sayHi() { return `Hi! ${this.name}`; } } // ์๋ธ ํด๋์ค class Derived extends Base { sayHi() { // super.sayHi๋ ์ํผ ํด๋์ค์ ํ๋กํ ํ์ ๋ฉ์๋๋ฅผ ๊ฐ๋ฆฌํต๋๋ค. return `${super.sayHi()}. how are you doing?`; } } const derived = new Derived('Lee'); console.log(derived.sayHi()); // Hi! Lee. how are you doing?
super๋ ์์ฌ์ ์ฐธ์กฐํ๊ณ ์๋ ๋ฉ์๋๊ฐ ๋ฐ์ธ๋ฉ๋ ๊ฐ์ฒด์ ํ๋กํ ํ์ ์ ๊ฐ๋ฆฌํต๋๋ค.
super๋ฅผ ์ฐธ์กฐ๋ก ์ฌ์ฉํ๋ ํํ๋ค์ ๋ณผ๊น์?
-
์๋ธ ํด๋์ค์ ํ๋กํ ํ์ ๋ฉ์๋ ๋ด์์
super.๋ฉ์๋
๋ ์ํผ ํด๋์ค์ ํ๋กํ ํ์ ๋ฉ์๋๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.// ์ํผ ํด๋์ค class Base { constructor(name) { this.name = name; } sayHi() { return `Hi! ${this.name}`; } } // ์๋ธ ํด๋์ค class Derived extends Base { sayHi() { // super.sayHi๋ ์ํผ ํด๋์ค์ ํ๋กํ ํ์ ๋ฉ์๋๋ฅผ ๊ฐ๋ฆฌํต๋๋ค. return `${super.sayHi()}. how are you doing?`; } } const derived = new Derived('Lee'); console.log(derived.sayHi()); // Hi! Lee. how are you doing?
- ๋จ, super๊ฐ ์ํผ ํด๋์ค์ ๋ฉ์๋๊ฐ ๋ฐ์ธ๋ฉ ๋ ๊ฐ์ฒด์ธ ์ํผ ํด๋์ค์ prototype ํ๋กํผํฐ์ ๋ฐ์ธ๋ฉ๋ ํ๋กํ ํ์
์ ์ฐธ์กฐํ ์ ์์ด์ผ ํฉ๋๋ค. ์๋ ์ฒ๋ผ์.
// ์ํผ ํด๋์ค class Base { constructor(name) { this.name = name; } sayHi() { return `Hi! ${this.name}`; } } class Derived extends Base { sayHi() { // __super๋ Base.prototype์ ๊ฐ๋ฆฌํต๋๋ค. const __super = Object.getPrototypeOf(Derived.prototype); return `${__super.sayHi.call(this)} how are you doing?`; } }
- ์ด๋ ๊ฒ ๋์ํ๊ธฐ ์ํด ๋ฉ์๋๋ ๋ด๋ถ ์ฌ๋กฏ
[[HomeObject]]
๋ฅผ ๊ฐ์ง๋ฉฐ ์์ ์ ๋ฐ์ธ๋ฉํ๊ณ ์๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.- ๋จ, ES6์ ๋ฉ์๋ ์ถ์ฝ ํํ์ผ๋ก ์ ์๋ ํจ์๋ง
[[HomeObject]]
๋ฅผ ๊ฐ์ต๋๋ค.const obj = { // [[HomeObject]]๋ฅผ ๊ฐ์ต๋๋ค. foo() {}, // [[HomeObject]]๋ฅผ ๊ฐ์ง ์์ต๋๋ค. bar: function () {} };
- ๋จ, ES6์ ๋ฉ์๋ ์ถ์ฝ ํํ์ผ๋ก ์ ์๋ ํจ์๋ง
๊ฒฐ๊ตญ super ์ฐธ์กฐ๋ฅผ ์์ฌ ์ฝ๋๋ก ํํํ๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
super = Object.getPrototypeOf([[HomeObject]])
[[HomeObject]]
๋ ๋ฉ์๋ ์์ ์ ๋ฐ์ธ๋ฉํ๊ณ ์๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.[[HomeObject]]
๋ฅผ ํตํด ๋ฉ์๋ ์์ ์ ๋ฐ์ธ๋ฉํ๊ณ ์๋ ๊ฐ์ฒด์ ํ๋กํ ํ์ ์ ์ฐพ์ ์ ์์ต๋๋ค.- ์๋ก ๋ค์๋ฉด, Derived ํด๋์ค์ sayHi ๋ฉ์๋๋ Derived.prototype์ ๋ฐ์ธ๋ฉ๋์ด ์์ต๋๋ค.
- ๋ฐ๋ผ์ Derived ํด๋์ค์ sayHi ๋ฉ์๋์
[[HomeObject]]
๋ Derived.prototype์ด๊ณ , ์ด๋ฅผ ํตํด Derived ํด๋์ค์ sayHi ๋ฉ์๋ ๋ด๋ถ์ super ์ฐธ์กฐ๊ฐ Base.prototype์ผ๋ก ๊ฒฐ์ ๋ฉ๋๋ค. - ์ต์ข ์ ์ผ๋ก super.sayHi๋ Base.prototype.sayHi๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋ผ์ฃ .
- ๋ฐ๋ผ์ Derived ํด๋์ค์ sayHi ๋ฉ์๋์
- ๋จ, super๊ฐ ์ํผ ํด๋์ค์ ๋ฉ์๋๊ฐ ๋ฐ์ธ๋ฉ ๋ ๊ฐ์ฒด์ธ ์ํผ ํด๋์ค์ prototype ํ๋กํผํฐ์ ๋ฐ์ธ๋ฉ๋ ํ๋กํ ํ์
์ ์ฐธ์กฐํ ์ ์์ด์ผ ํฉ๋๋ค. ์๋ ์ฒ๋ผ์.
- ์๋ธ ํด๋์ ์ ์ ๋ฉ์๋ ๋ด์์
super.๋ฉ์๋
๋ ์ํผ ํด๋์ค์ ์ ์ ๋ฉ์๋๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.// ์ํผ ํด๋์ค class Base { static sayHi() { return 'Hi!'; } } // ์๋ธ ํด๋์ค class Derived extends Base { static sayHi() { // super.sayHi๋ ์ํผ ํด๋์ค์ ์ ์ ๋ฉ์๋๋ฅผ ๊ฐ๋ฆฌํต๋๋ค. return `${super.sayHi()} how are you doing?`; } } console.log(Derived.sayHi()); // Hi! how are you doing?
ํด๋์ค๊ฐ ๋จ๋ ์ผ๋ก ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ณผ์ ๋ณด๋ค ์์์ ํตํด ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ณผ์ ์ด ๋ ๋ณต์กํฉ๋๋ค.
์๋ธ ํด๋์ค๊ฐ new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถ๋๋ฉด ์๋์ ๊ณผ์ ์ ํตํด ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค.
- ์๋ธ ํด๋์ค์ super ํธ์ถ
- ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ํด๋์ค ํ๊ฐ ์ ์ํผ ํด๋์ค์ ์๋ธ ํด๋์ค๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํด
base
๋๋derived
๋ฅผ ๊ฐ์ผ๋ก ๊ฐ๋ ๋ด๋ถ ์ฌ๋กฏ[[ConstructorKind]]
๋ฅผ ๊ฐ์ต๋๋ค. - ๋ค๋ฅธ ํด๋์ค๋ฅผ ์์๋ฐ์ง ์๋ ํด๋์ค๋ ๋ด๋ถ ์ฌ๋กฏ
[[ConstructorKind]]
์ ๊ฐ์ดbase
์ธ ๋ฐ๋ฉด, ๋ค๋ฅธ ํด๋์ค๋ฅผ ์์๋ฐ๋ ํด๋์ค๋derived
๋ก ์ค์ ๋๋ฉฐ ์ด๋ฅผ ํตํด ๋์์ด ๊ตฌ๋ถ๋ฉ๋๋ค. - ์์๋ฐ๋ ํด๋์ค๊ฐ new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถ๋๋ฉด ์์ ์ด ์ง์ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์๊ณ ์ํผ ํด๋์ค์ ์ธ์คํด์ค ์์ฑ์ ์์ํฉ๋๋ค. ์ด๊ฒ ๋ฐ๋ก ์๋ธ ํด๋์ค์ constructor์์ ๋ฐ๋์ super๋ฅผ ํธ์ถํด์ผ ํ๋ ์ด์ ์ฃ .
- super๊ฐ ํธ์ถ๋๋ฉด ์ํผ ํด๋์ค์ constructor๊ฐ ํธ์ถ๋ฉ๋๋ค. ์๋ธ ํด๋์ค์ constructor ๋ด๋ถ์ super ํธ์ถ์ด ์๋ค๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ ์ด์ ๋ ์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ์ฃผ์ฒด๋ ์ํผ ํด๋์ค์ด๋ฏ๋ก, ์ํผ ํด๋์ค์ constructor๊ฐ ํธ์ถ๋์ง ์์ผ๋ฉด ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ด์ฃ .
- ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ํด๋์ค ํ๊ฐ ์ ์ํผ ํด๋์ค์ ์๋ธ ํด๋์ค๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํด
- ์ํผ ํด๋์ค์ ์ธ์คํด์ค ์์ฑ๊ณผ this ๋ฐ์ธ๋ฉ
- ์ํผ ํด๋์ค์ constructor ๋ด๋ถ์ ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ด์ ์ ์๋ฌต์ ์ผ๋ก ๋น ๊ฐ์ฒด๋ฅผ ์์ฑํ๋๋ฐ, ์ด ๋น ๊ฐ์ฒด๊ฐ ํด๋์ค์ ์ธ์คํด์ค์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ฌต์ ์ผ๋ก ์์ฑ๋ ๋น ๊ฐ์ฒด๋ this์ ๋ฐ์ธ๋ฉ ๋์ฃ . ๊ฒฐ๊ตญ ์ํผ ํด๋์ค์ constructor ๋ด๋ถ์ this๋ ์์ฑ๋ this๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋ฉ๋๋ค.
- ์ด ๋ ์ธ์คํด์ค๋ ์ํผ ํด๋์ค๊ฐ ์์ฑํ ๊ฒ์ด์ง๋ง, new ์ฐ์ฐ์์ ํจ๊ฒ ํธ์ถ๋ ํด๋์ค๋ ์๋ธ ํด๋์ค์
๋๋ค. ์ฆ, new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถ๋ ํจ์๋ฅผ ๊ฐ๋ฆฌํค๋
new.target
์ ์๋ธ ํด๋์ค๋ฅผ ๊ฐ๋ฆฌํค๋ฉฐ, ์ธ์คํด์ค๋new.target
์ด ๊ฐ๋ฆฌํค๋ ์๋ธ ํด๋์ค๊ฐ ์์ฑํ ๊ฒ์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. - ๊ฒฐ๊ตญ ์์ฑ๋ ์ธ์คํด์ค์ ํ๋กํ ํ์
์ ์ํผ ํด๋์ค์ prototype ํ๋กํผํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ฒด๊ฐ ์๋๋ผ
new.target
์ด ๊ฐ๋ฆฌํค๋ ์๋ธ ํด๋์ค์ prototype ํ๋กํผํฐ์ ๊ฐ์ฒด๊ฐ ๋๋ ๊ฒ์ด์ฃ .
- ์ํผ ํด๋์ค์ ์ธ์คํด์ค ์ด๊ธฐํ
- ์ํผ ํด๋์ค์ constructor๊ฐ ์คํ๋๊ณ this์ ๋ฐ์ธ๋ฉ๋ ์ธ์คํด์ค๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
- ์๋ธ ํด๋์ค constructor๋ก์ ๋ณต๊ท์ this ๋ฐ์ธ๋ฉ
- super ํธ์ถ์ด ์ข ๋ฃ๋๊ณ ์ ์ด ํ๋ฆ์ด ์๋ธ ํด๋์ค๋ก ๋์์ค๋ฉด super๊ฐ ๋ฐํํ ์ธ์คํด์ค๊ฐ this์ ๋ฐ์ธ๋ฉ๋ฉ๋๋ค.
- ์๋ธ ํด๋์ค๋ ๋ณ๋์ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์๊ณ super๊ฐ ๋ฐํํ ์ธ์คํด์ค๋ฅผ this์ ๋ฐ์ธ๋ฉํ์ฌ ๊ทธ๋๋ก ์ฌ์ฉํฉ๋๋ค.
- ์ด์ฒ๋ผ super๊ฐ ํธ์ถ๋์ง ์์ผ๋ฉด ์ธ์คํด์ค๊ฐ ์์ฑ๋๊ธฐ๋ ์ปค๋ this ๋ฐ์ธ๋ฉ๋ ์ด๋ฃจ์ด์ง์ง ์์ต๋๋ค. ์๋ธ ํด๋์ค์ constructor์์ super๋ฅผ ํธ์ถํ๊ธฐ ์ ์๋ this๋ฅผ ์ฐธ์กฐํ ์ ์๋ ์ด์ ์ฃ .
- ์๋ธํด๋์ค์ ์ธ์คํด์ค ์ด๊ธฐํ
- ์๋ธ ํด๋์ค์ constructor๊ฐ ์คํ๋๊ณ this์ ๋ฐ์ธ๋ฉ๋ ์ธ์คํด์ค์ ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
- ์ธ์คํด์ค ๋ฐํ
- ํด๋์ค์ ๋ชจ๋ ์ฒ๋ฆฌ๊ฐ ๋๋๋ฉด ์์ฑ๋ ์ธ์คํด์ค๊ฐ ๋ฐ์ธ๋ฉ๋ this๊ฐ ์๋ฌต์ ์ผ๋ก ๋ฐํ๋ฉ๋๋ค.