Programming/JavaScript

[๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive] 16์žฅ ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ(property attribute)๋ž€?

yuri lee 2023. 6. 4. 15:01
๋ฐ˜์‘ํ˜•

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


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

 

๋ชจ๋“  ๊ฐ์ฒด๋Š” [[Prototype]] ์ด๋ผ๋Š” ๋‚ด๋ถ€ ์Šฌ๋กฏ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ์Šฌ๋กฏ์€ JS ์—”์ง„์˜ ๋‚ด๋ถ€ ๋กœ์ง์ด๋ฏ€๋กœ ์›์น™์ ์œผ๋กœ ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์ง€๋งŒ __proto__๋ฅผ ํ†ตํ•ด ๊ฐ„์ ‘ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. 

 

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


Js ์—”์ง„์€ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ”„๋กœํผํ‹ฐ์˜ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ž๋™ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœํผํ‹ฐ์˜ ์ƒํƒœ๋ž€ ๊ฐ’ (value), ๊ฐ’์˜ ๊ฐฑ์‹  ๊ฐ€๋Šฅ ์—ฌ๋ถ€ (writable), ์—ด๊ฑฐ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ (enumerable), ์žฌ์ •์˜ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ (configurable)๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. 

 

ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์ง€๋งŒ ์•„๋ž˜์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฐ„์ ‘์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

const person = { name: "Lee" };
Object.getOwnPropertyDescriptor(person, 'name'); 
// {value: 'Lee', writable: true, enumerable: true, configurable: true}

 

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


๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ (data property) : ํ‚ค์™€ ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ๋œ ์ผ๋ฐ˜์ ์ธ ํ”„๋กœํผํ‹ฐ

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

 

16.3.1 ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ (data property)

JS์—”์ง„์ด ํ”„๋กœํผํ‹ฐ๋ฅผ ์ƒ์„ฑ ํ•  ๋•Œ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ž๋™ ์ •์˜๋ฉ๋‹ˆ๋‹ค. 

ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ  ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ  ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ  ์„ค๋ช…
[[Vaule]] value ํ”„๋กœํผํ‹ฐ ํ‚ค๋ฅผ ํ†ตํ•ด ํ”„๋กœํผํ‹ฐ ๊ฐ’์— ์ ‘๊ทผํ•˜๋ฉด ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ’
[[Writable]] writable ํ”„๋กœํผํ‹ฐ ๊ฐ’์˜ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ ๋ถˆ๋ฆฌ์–ธ ๊ฐ’์„ ๊ฐ–์Œ
[[Enumerable]] enumerable ํ”„๋กœํผํ‹ฐ์˜ ์—ด๊ฑฐ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ ๋ถˆ๋ฆฌ์–ธ ๊ฐ’์„ ๊ฐ–์Œ
[[Configurable]] configurable ํ”„๋กœํผํ‹ฐ์˜ ์žฌ์ •์˜ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ ๋ถˆ๋ฆฌ์–ธ ๊ฐ’์„ ๊ฐ–์Œ

 

 

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

ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ  ์„ค๋ช…
[[Get]] get ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ์ฝ์„ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์ ‘๊ทผ์ž ํ•จ์ˆ˜. getter ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ํ”„๋กœํผํ‹ฐ ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜๋จ 
[[Set]] set ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ์ €์žฅํ•  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์ ‘๊ทผ์ž ํ•จ์ˆ˜, setter ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ํ”„๋กœํผํ‹ฐ ๊ฐ’์œผ๋กœ ์ €์žฅ 
[[Enumerable]] enumerable  
[[Configurable]] configurable  

 

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


ํ”„๋กœํผํ‹ฐ ์ •์˜๋ž€ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๊ฐฑ์‹  ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•  ๊ฒƒ์ธ์ง€, ์—ด๊ฑฐ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•  ๊ฒƒ์ธ์ง€, ์žฌ์ •์˜ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•  ๊ฒƒ์ธ์ง€ ๋“ฑ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

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


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

๊ตฌ๋ถ„ ๋ฉ”์„œ๋“œ ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€ ํ”„๋กœํผํ‹ฐ ์‚ญ์ œ ํ”„๋กœํผํ‹ฐ ๊ฐ’ ์ฝ๊ธฐ ํ”„๋กœํผํ‹ฐ ๊ฐ’ ์“ฐ๊ธฐ ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์žฌ์ •์˜
๊ฐ์ฒด ํ™•์žฅ ๊ธˆ์ง€ Object.oporeventExtensions X O O O O
๊ฐ์ฒด ๋ฐ€๋ด‰ Object.seal X O O X
๊ฐ์ฒด ๋™๊ฒฐ Object.freeze X X O X X

 


Reference: ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive

๋ฐ˜์‘ํ˜•