Class
JS์์๋ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด ์งํฅ์ ์ผ๋ก ํ๋ก๊ทธ๋๋ฐ์ด ๊ฐ๋ฅํ๋ค.
ํํ์
class ๋ฅผ ์ด์ฉํด ์ ์ธํ๊ณ  new๋ฅผ ์ด์ฉํด ์์ฑ
class User {
  constructor(name) {
    //์์ฑ์
    this.name = name;
  }
  sayHi() {
    alert(this.name);
  }
}
let user = new User('John');
user.sayHi();
alert(typeof User); // function
alert(User === User.prototype.constructor); // true
alert(User.prototype.sayHi); // alert(this.name);
alert(Object.getOwnPropertyNames(User.prototype)); // constructor, sayHi- ๊ธฐ๋ช ํํ์ 
let User = class {
  sayHi() {
    alert('Hello');
  }
};
new User().sayHi();
alert(MyClass); //error- ํด๋์ค ๋์  ์์ฑ 
function makeClass(phrase) {
  // ํด๋์ค๋ฅผ ์ ์ธํ๊ณ  ์ด๋ฅผ ๋ฐํํจ
  return class {
    sayHi() {
      alert(phrase);
    }
  };
}
// ์๋ก์ด ํด๋์ค๋ฅผ ๋ง๋ฆ
let User = makeClass('Hello');
new User().sayHi(); // Hello์๋ฆฌ
์์ ์ฝ๋๋ฅผ ์๋ก User๋ผ๋ ํจ์๋ฅผ ๋ง๋ค๊ณ  ํจ์๋ ์์ฑ์constructor๋ก ๋ถํฐ ์์ฑํ๊ณ  ํด๋์ค ๋ด์ ๋ฉ์๋๋ค์ User.prototype์ ์ ์ฅํ๋ค
์ผ๋ฐ์ ์ธ ์์ฑ์ ํจ์์ ๋ค๋ฅธ์ 
- class๋ก ๋ง๋ ํจ์์ ํน์ ๋ด๋ถ ํ๋กํผํฐ์ธ - [[FunctionKind]]:"classConstructor"๊ฐ ์กด์ฌํ๋ค. ๋ฐ๋ผ์- new๋ฅผ ๋ถ์ด์ง ์๊ณ- User();์ ๊ฐ์ด ๊ทธ๋ฅ ํธ์ถํ๊ฒ ๋๋ค๋ฉด ์๋ชป ์ฌ์ฉ๋๊ฒ์ ๊ฐ์งํ๊ณ ์๋ฌ๋ฅผ ๋ฐ์์ํจ๋ค.
- prototype์ ๋ฉ์๋ ์ ์ฒด์ - enumerableํ๋๊ทธ๋ false๋ก ํด๋์ค ๋ฉ์๋๋ ์ด๊ฑฐ๊ฐ ๋ถ๊ฐ๋ฅ ํ๋ค.
- ํญ์ - use strict๋ชจ๋๋ก ์คํ๋์ด ํด๋์ค ์์ฑ์ ์์ ์ฝ๋ ์ ์ฒด์ ์๋์ผ๋ก ์๊ฒฉ๋ชจ๋๊ฐ ์ ์ฉ๋๋ค.
getter/setter
๋ฆฌํฐ๋ด์ ์ฌ์ฉํด ๋ง๋ ๊ฐ์ฒด์ฒ๋ผ getter/setter๋ฅผ ๋ง๋ค ์ ์๋ค.
class User {
  constructor(name) {
    // setter๋ฅผ ํ์ฑํํฉ๋๋ค.
    this.name = name;
  }
  get name() {
    return this._name;
  }
  set name(value) {
    if (value.length < 4) {
      alert('์ด๋ฆ์ด ๋๋ฌด ์งง์ต๋๋ค.');
      return;
    }
    this._name = value;
  }
}
let user = new User('John');
alert(user.name); // John
user = new User(''); // ์ด๋ฆ์ด ๋๋ฌด ์งง์ต๋๋ค.ํด๋์ค ํ๋
ํ๋กํผํฐ์ด๋ฆ = ๊ฐ ์ผ๋ก ํ๋๋ฅผ ์ถ๊ฐ๊ฐ ๊ฐ๋ฅํ๋ฉฐ, Obj.prototype์ด ์๋ ๊ฐ๋ณ ๊ฐ์ฒด์๋ง ํด๋์ค ํ๋๊ฐ ์ค์ ๋๋ค.
class User {
  name = 'John';
}
let user = new User();
alert(user.name); // John
alert(User.prototype.name); // undefinedLast updated