front-end/JavaScript

[JavaScript] 14. ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ

gaan 2023. 4. 11. 01:33

๐Ÿ“– ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ต์žฌ) 16์žฅ. ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ

 

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

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

 


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

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ”„๋กœํผํ‹ฐ์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ž๋™ ์ •์˜ํ•œ๋‹ค.
  • ํ”„๋กœํผํ‹ฐ์˜ ์ƒํƒœ : ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’(value), ๊ฐ’์˜ ๊ฐฑ์‹  ๊ฐ€๋Šฅ ์—ฌ๋ถ€(writable), ์—ด๊ฑฐ ๊ฐ€๋Šฅ ์—ฌ๋ถ€(enumerable), ์žฌ์ •์˜ ๊ฐ€๋Šฅ ์—ฌ๋ถ€(configurable) 
  • ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ : ๋‚ด๋ถ€ ์ƒํƒœ ๊ฐ’์ธ ๋‚ด๋ถ€ ์Šฌ๋กฏ [[Value]], [[Writable]], [[Enumerable]], [[Configurable]]
  • ํ”„๋กœํผํ‹ฐ์— ์ง์ ‘ ์ ‘๊ทผ X, Object.getOwnPropertyDescriptor ๋ฉ”์„œ๋“œ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„์ ‘์  ํ™•์ธ O

๐Ÿ–ฅ๏ธ ์˜ˆ์‹œ ์ฝ”๋“œ

const person = {
    name: 'Lee'
};

// ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
console.log(Object.getOwnPropertyDescriptor(person, 'name'));
// {value: "Lee", writable: true, enumerable: true, configurable: true}

โžก๏ธ Object.getOwnPropertyDescriptor ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜) ๊ฐ์ฒด์˜ ์ฐธ์กฐ ์ „๋‹ฌ, ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜) ํ”„๋กœํผํ‹ฐ ํ‚ค๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ „๋‹ฌ

โžก๏ธ ํ”„๋กœํผํ‹ฐ ๋””์ŠคํŠธ๋ฆฝํ„ฐ ๊ฐ์ฒด(ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์ •๋ณด ์ œ๊ณต) ๋ฐ˜ํ™˜

โš ๏ธ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ”„๋กœํผํ‹ฐ / ์ƒ์†๋ฐ›์€ ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•œ ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ ์š”๊ตฌ -> undefined ๋ฐ˜ํ™˜

 


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

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

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

 

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

 

ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ์„ค๋ช…
[[Value]] value 1. ํ”„๋กœํผํ‹ฐ ํ‚ค๋ฅผ ํ†ตํ•ด ๊ฐ’์— ์ ‘๊ทผํ•˜๋ฉด ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ’.
2. ํ”„๋กœํผํ‹ฐ ํ‚ค๋ฅผ ํ†ตํ•ด ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด [[Value]]์— ๊ฐ’์„ ์žฌํ• ๋‹น. / ์ด๋•Œ ํ”„๋กœํผํ‹ฐ ์—†์œผ๋ฉด ๋™์  ์ƒ์„ฑํ•˜์—ฌ ์ €์žฅ
[[Writable]] writable 1. ํ”„๋กœํผํ‹ฐ ๊ฐ’์˜ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ - ๋ถˆ๋ฆฌ์–ธ ๊ฐ’์„ ๊ฐ€์ง
2. [[Writable]]์˜ ๊ฐ’์ด false์ธ ๊ฒฝ์šฐ, ์ฝ๊ธฐ ์ „์šฉ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋จ
[[Enumerable]] enumerable 1. ํ”„๋กœํผํ‹ฐ์˜ ์—ด๊ฑฐ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ - ๋ถˆ๋ฆฌ์–ธ ๊ฐ’
2. [[Enumerable]]์˜ ๊ฐ’์ด false ์ธ ๊ฒฝ์šฐ, 
for...in๋ฌธ์ด๋‚˜ Object.keys ๋ฉ”์„œ๋“œ ๋“ฑ์œผ๋กœ ์—ด๊ฑฐ ๋ถˆ๊ฐ€
[[Configurable]] configurable 1. ํ”„๋กœํผํ‹ฐ ์žฌ์ •์˜ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ - ๋ถˆ๋ฆฌ์–ธ ๊ฐ’
2. [[Configurable]]์˜ ๊ฐ’์ด false ์ธ ๊ฒฝ์šฐ, ์‚ญ์ œ, ๊ฐ’์˜ ๋ณ€๊ฒฝ ๊ธˆ์ง€
๋‹จ, [[Writable]]์ด true์ธ ๊ฒฝ์šฐ, [[Valule]]์˜ ๋ณ€๊ฒฝ๊ณผ [[Writable]]์„ false๋กœ ๋ณ€๊ฒฝ ํ—ˆ์šฉ

 

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

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

 

๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ๊ฐ–๋Š”๋‹ค.

 

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

 

๐Ÿ’ก ์ ‘๊ทผ์ž ํ•จ์ˆ˜๋Š” getter/setter ํ•จ์ˆ˜๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค.

 

 


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

ํ”„๋กœํผํ‹ฐ ์ •์˜๋ž€ ์ƒˆ๋กœ์šด ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด์„œ ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•˜๊ฑฐ๋‚˜, ๊ธฐ์กด ํ”„๋กœํผํ‹ฐ์˜ ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

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

 โžก๏ธ Object.defineProperty ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ

 โžก๏ธ ์ธ์ˆ˜ -> ๊ฐ์ฒด์˜ ์ฐธ์กฐ, ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์˜ ํ‚ค์ธ ๋ฌธ์ž์—ด, ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐ์ฒด ์ „๋‹ฌ

 

 ๐Ÿ–ฅ๏ธ ์˜ˆ์‹œ ์ฝ”๋“œ

const person = {};

// ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ ์ •์˜
Object.defineProperty(person, 'firstName', {
    value: 'Ungmo',
    writable: true,
    enumerable: true,
    configurable: true
});

Object.defineProperty(person, 'lastname', {
    value:'Lee'
});

let descriptor = Object.getOwnPropertyDescriptor(person, 'firstName');
console.log('firstName', descriptor);
// firstName {value: "Ungmo", writable: true, enumerable: true, configurable: true}

 

โš ๏ธ Object.defineProperty ๋ฉ”์„œ๋“œ๋Š” ํ•œ๋ฒˆ์— ํ•˜๋‚˜์˜ ํ”„๋กœํผํ‹ฐ๋งŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

โžก๏ธ Object.defineProperties ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ํ•œ ๋ฒˆ์— ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

 


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

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

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

 

๊ฐ„๋‹จํžˆ ํ‘œ๋กœ ์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

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

 

๐Ÿ“– ์ฐธ๊ณ ์ž๋ฃŒ

https://www.inflearn.com/course/%EB%AA%A8%EB%8D%98-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%94%A5%EB%8B%A4%EC%9D%B4%EB%B8%8C/dashboard