๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
javascript/๐Ÿ“– study

[3์ฃผ์ฐจ ์Šคํ„ฐ๋””] 16์žฅ ํ”„๋กœํผํ‹ฐ, ์–ดํŠธ๋ฆฌ๋ทฐํŠธ

by HomieKim 2022. 2. 14.

ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ

๋‚ด๋ถ€์Šฌ๋กฏ๊ณผ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์˜ ๊ตฌํ˜„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ค๋ช…ํ•˜๊ธฐ์œ„ํ•ด ECMAScript ์‚ฌ์–‘์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์˜์‚ฌ ํ”„๋กœํผํ‹ฐpseudo property์™€ ์˜์‚ฌ ๋ฉ”์„œ๋“œpseudo method
  • ECMAScript ์‚ฌ์–‘์—์„œ ์ด์ค‘๋Œ€๊ด„ํ˜ธ ([[ ... ]])๋กœ ๊ฐ์‹ผ์ด๋ฆ„๋“ค์ด ๋‚ด๋ถ€ ์Šฌ๋กฏ๊ณผ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ
  • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐœ๋œ ํ”„๋กœํผํ‹ฐ๋Š” ์•„๋‹˜
  • ์ผ๋ถ€์— ํ•œํ•˜์—ฌ ๊ฐ„์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋‹จ์ด ์ œ๊ณต๋จ

    ex) ๋ชจ๋“  ๊ฐ์ฒด๋Š” [[Prototype]]์ด๋ผ๋Š” ๋‚ด๋ถ€ ์Šฌ๋กฏ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. [[Prototype]]์˜ ๊ฒฝ์šฐ, proto๋ฅผ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœํผํ‹ฐ ์–ดํ‹ฐ๋ฆฌ๋ทฐํŠธ, ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐ์ฒด

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ”„๋กœํผํ‹ฐ์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ž๋™ ์ •์˜ ํ•œ๋‹ค.

    Object.getOwnPropertyDescriptor ๋ฉ”์„œ๋“œ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„์ ‘์ ์œผ๋กœ ํ™•์ธ ๊ฐ€๋Šฅ
    ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๊ฐ์ฒด์˜ ์ฐธ์กฐ๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ๋‘๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜์—๋Š” ํ”„๋กœํผํ‹ฐ ํ‚ค๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ „๋‹ฌ
    Object.getOwnPropertyDescriptor ๋ฉ”์„œ๋“œ๋Š” ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์™€ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ

  • ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ (data property) : ํ‚ค์™€ ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ๋œ ์ผ๋ฐ˜์ ์ธ property
  • ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ (accessor property) : ์ž์ฒด์ ์œผ๋กœ๋Š” ๊ฐ’์„ ๊ฐ–๊ณ ์žˆ์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜ ์ €์žฅํ•  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์ ‘๊ทผ์ž ํ•จ์ˆ˜๋กœ ๊ตฌ์„ฑ๋œ ํ”„๋กœํผํ‹ฐ

๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ

  • ์ข…๋ฅ˜ (property attribute)
    • [[ Value ]] : ํ”„๋กœํผํ‹ฐ ํ‚ค์— ํ• ๋‹น๋œ ํ”„๋กœํผํ‹ฐ ๊ฐ’
    • [[ Writable ]] : ํ”„๋กœํผํ‹ฐ ๊ฐ’์˜ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ ์—ฌ๋ถ€
    • [[ Enumerable ]] : ์—ด๊ฑฐ ๊ฐ€๋Šฅ ์—ฌ๋ถ€
    • [[ Configurable ]] : ์žฌ์ •์˜ ๊ฐ€๋Šฅ ์—ฌ๋ถ€

์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ

  • ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ(accessor property)๋Š” ์ž์ฒด์ ์œผ๋กœ ๊ฐ’์„ ๊ฐ–์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜ ์ €์žฅํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ ‘๊ทผ์žํ•จ์ˆ˜ ๊ตฌ์„ฑ๋œ ํ”„๋กœํผํ‹ฐ
  • ์ข…๋ฅ˜
    • [[ Get ]] : ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ์ฝ์„ ๋•Œ ํ˜ธ์ถœ ๋˜๋Š” ์ ‘๊ทผ์ž ํ•จ์ˆ˜
    • [[ Set ]] : ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ์ €์žฅํ•  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์ ‘๊ทผ์ž ํ•จ์ˆ˜
    • [[ Enumerable ]] : ์—ด๊ฑฐ ๊ฐ€๋Šฅ ์—ฌ๋ถ€
    • [[ Configurable ]] : ์žฌ์ •์˜ ๊ฐ€๋Šฅ ์—ฌ๋ถ€
  • ๋ฉ”์„œ๋“œ ์•ž์— get / set ์„ ๋ถ™์ด๋ฉด ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋กœ ๋™์ž‘ํ•จ ์ด๋ฅผ getter / setter ํ•จ์ˆ˜๋ผ๊ณ  ํ•œ๋‹ค.

ํ”„๋กœํผํ‹ฐ ์ •์˜

  • Object.definedProperty ๋ฉ”์„œ๋“œ ์‚ฌ์šฉํ•ด์„œ ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ ๊ฐ€๋Šฅ
  • ์ •์˜ ์‹œ ํ”„๋กœํผํ‹ฐ ์ƒ๋žต์‹œ ๊ธฐ๋ณธ๊ฐ’
    • value, get, set : undefined
    • writable, enumerable, configurable : false

๊ฐ์ฒด ๋ณ€๊ฒฝ ๋ฐฉ์ง€

  • ๊ฐ์ฒด๋Š” ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๊ฐ’์ด๋ฏ€๋กœ ์žฌํ• ๋‹น ์—†์ด ๊ฐ’์„ ๋ณ€๊ฒฝ๊ฐ€๋Šฅ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ฐ์ฒด์˜ ๋ณ€๊ฒฝ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์ฒด ํ™•์žฅ ๊ธˆ์ง€

  • Object.preventExtensions๋ฉ”์„œ๋“œ
  • ๊ฐ์ฒด์˜ ์ถ”๊ฐ€๋ฅผ ๊ธˆ์ง€ํ•˜๋Š” ๋ฉ”์„œ๋“œ ์ž…๋‹ˆ๋‹ค.
  • ๊ฐ์ฒด ์‚ญ์ œ๋Š” ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์ฒด๋ฐ€๋ด‰

  • Object.seal ๋ฉ”์„œ๋“œ
  • ๋ฐ€๋ด‰๋œ ๊ฐ์ฒด๋Š” ์ฝ๊ธฐ์™€์“ฐ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ์ฒด์˜ ์‚ญ์ œ์™€ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์žฌ์ •์˜๋„ ๊ธˆ์ง€๋ฉ๋‹ˆ๋‹ค.

๊ฐ์ฒด๋™๊ฒฐ

  • Object.freeze
  • ๋™๊ฒฐ๋œ ๊ฐ์ฒด๋Š” ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋ถˆ๋ณ€๊ฐ์ฒด

  • ํ™•์žฅ๊ธˆ์ง€, ๊ฐ์ฒด๋ฐ€๋ด‰, ๊ฐ์ฒด๋™๊ฒฐ์€ ์–•์€ ๋ณ€๊ฒฝ ๋ฐฉ์ง€( ์ค‘์ฒฉ๋œ ๊ฐ์ฒด ๊นŒ์ง€ ๋ณ€๊ฒฝ ๋ฐฉ์ง€ ํ•˜์ง€ ๋ชปํ•จ )
  • ์ค‘์ฒฉ๊ฐ์ฒด ๊นŒ์ง€ ๋™๊ฒฐํ•˜์—ฌ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ๊ฐ์ฒด๋ฅผ ๊ฐ’์œผ๋กœ ๊ฐ–๋Š” ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•ด ์žฌ๊ท€์ ์œผ๋กœ Object.freeze๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผํ•œ๋‹ค.

๋Œ“๊ธ€