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에 μ €μž₯ν•œλ‹€

일반적인 μƒμ„±μž ν•¨μˆ˜μ™€ λ‹€λ₯Έμ 

  1. class둜 λ§Œλ“  ν•¨μˆ˜μ—” 특수 λ‚΄λΆ€ ν”„λ‘œνΌν‹°μΈ [[FunctionKind]]:"classConstructor"κ°€ μ‘΄μž¬ν•œλ‹€. λ”°λΌμ„œ newλ₯Ό 뢙이지 μ•Šκ³  User();와 같이 κ·Έλƒ₯ ν˜ΈμΆœν•˜κ²Œ λœλ‹€λ©΄ 잘λͺ» μ‚¬μš©λœκ²ƒμ„ κ°μ§€ν•˜κ³  μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

  2. prototype의 λ©”μ„œλ“œ μ „μ²΄μ˜ enumerableν”Œλž˜κ·ΈλŠ” false둜 클래슀 λ©”μ„œλ“œλŠ” μ—΄κ±°κ°€ λΆˆκ°€λŠ₯ ν•˜λ‹€.

  3. 항상 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); // undefined

Last updated