Decorators - ChoDragon9/posts GitHub Wiki

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๊ฐœ์š”

  • tc39/proposal-decorators์— ์ •์˜
  • Orthogonal Classes์™€ Class Evaluation Order ์ œ์•ˆ์„ ๋ฐ”ํƒ•์œผ๋กœ Decorators์™€ Class Field ๋ฐ Private methods๋ฅผ ํ•จ๊ป˜ ์ž‘๋™์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ฒฐํ•ฉ ๋œ ๋น„์ „์„ ์ œ์•ˆ
  • ์žฅ์‹์ž๋Š” ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ์œ ์šฉํ•จ
  • ๋ฉ”๋ชจ์ด์ œ์ด์…˜, ์ ‘๊ทผ ์ œ์–ด, ์ธ์ฆ, ๊ณ„์ธก, ํƒ€์ด๋ฐ ์ฒ˜๋ฆฌ, ๋กœ๊น…, ์†๋„ ์ œํ•œ ๋“ฑ์— ์‚ฌ์šฉ๋œ๋‹ค.
  • ์•„๋ž˜์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • @defineElement ์ปค์Šคํ…€ ์—˜๋ ˆ๋ฉ˜ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ
    • @bound ๋””๋ฐ”์šด๋“œ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ
    • @observed ํ•„๋“œ๋ฅผ ๊ฐ์‹œํ•˜๋ฉฐ ๋ณ€๊ฒฝ์‹œ ์ž๋™์œผ๋กœ render()๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ธฐ๋Šฅ
@defineElement('num-counter')
class Counter extends HTMLElement {
  @observed #x = 0;

  @bound
  #clicked() {
    this.#x++;
  }

  constructor() {
    super();
    this.onclick = this.#clicked;
  }

  connectedCallback() { this.render(); }

  @bound
  render() {
    this.textContent = this.#x.toString();
  }
}

Orthogonal = ์ง๊ต์„ฑ

  • ์ง๊ต๋ž€ ๋‘˜ ์ด์ƒ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์ฒด๊ณ„๊ฐ€ ์„œ๋กœ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์œผ๋ฉด์„œ ํ•จ๊ป˜ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๋‚˜ ํŠน์ง•์„ ๋งํ•œ๋‹ค.
  • ์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ์ด ๋ณ€๊ฒฝ์ด ๋˜๋„ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” ๋‹ค๋ฉด ์„œ๋กœ ์ง๊ตํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.
  • ์ผ์ข…์˜ ๋…๋ฆฝ์„ฑ, ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

Field declarations

// ES2015
class Counter {
  constructor () {
    this.x = 0
  }
}

// ESnext field declarations proposal
class Counter {
  x = 0
  constructor () { }
}

Private methods and fields

class Counter {
  #x = 0
  #clicked () { }
}