
๋ค์ property๋ก ๋์๊ฐ์.
JavaScript ์์ง์, property attribute ๋ฅผ ์๋ ์ ์ํ๋ค.
(property arrtibute : property์ ์ํ)
property attribute๋ JavaScript ์์ง์ด ๊ด๋ฆฌํ๋ internal slot์ด๋ค.
internal slot & internal method ๋ด๋ถ ์ฌ๋กฏ๊ณผ ๋ด๋ถ ๋ฉ์๋
internal slot๊ณผ internal method๋, JavaScript์ ๊ตฌํ ์๊ณ ๋ฆฌ์ฆ์ ์ค๋ช ํ๊ธฐ ์ํ ๊ฒ์ด๋ค.
์ง์ ์ ์ธ ์ ๊ทผ์ ๋ถ๊ฐ๋ฅํ์ง๋ง,Object.getOwnPropertyDescriptor๋ฉ์๋๋ก ์ผ๋ถ ๊ฐ์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
์ด๋ฌํ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด,
์ฒซ ๋งค๊ฐ๋ณ์์๋ ๊ฐ์ฒด์ ์ฐธ์กฐ๋ฅผ ๋ฐํํ๊ณ ,
๋๋ฒ์งธ ๋งค๊ฐ๋ณ์์๋ property key๋ฅผ ๋ฌธ์์ด๋ก ์ ๋ฌํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฉ์๋๋, property arribute ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ Property Descriptor ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
์ด property ๋ผ๋ ๊ฑด, ๋๊ฐ์ง๋ก ๋๋์ด๋ณผ ์ ์๋ค.
์ฐ๋ฆฌ๊ฐ ์๊ณ ์๋ property๋,
์ฆ key์ value๋ก ๊ตฌ์ฑ๋๋ property๋, data property ์ ํด๋นํ๋ค.
[[Value]] [[Writable]] [[Enumerable]] [[Configurable]] ์ด data property arribute์ด๋ค.
๋ฐ๋ฉด, ์์ฒด์ ์ธ ๊ฐ์ ๊ฐ์ง ์๊ณ ,
๋ค๋ฅธ data property์ ๊ฐ์ ์ฝ๊ฑฐ๋ ์ ์ฅํ ๋์ ํธ์ถ๋๋ accessor function์ผ๋ก ๊ตฌ์ฑ๋ property๋ฅผ accessor property ๋ผ๊ณ ํ๋ค.
์ด ํจ์๋ getter/setter ํจ์๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค.
[[Get]] [[Set]] [[Enumerable]] [[Configurable]] ์ด accessor property attribute์ด๋ค.
์ด ๋์ ์ด๋ป๊ฒ ๊ตฌ๋ณํ ์ ์์๊น?
accessor property์ ๊ฒฝ์ฐ ~~๋ฅผ ๋ฐํํ๊ณ , data property์ ๊ฒฝ์ฐ ~~๋ฅผ ๋ฐํํ๋ค.
// ํจ์ ๊ฐ์ฒด์ prototpye์ data property์ด๋ค.
Object.getOwnPropertyDescriptor(function() {}, 'prototype');
//-> {value: {...}, writable: true, enumerable: false, configurable: false}
// ์ผ๋ฐ ๊ฐ์ฒด์ __proto__๋ accessor property์ด๋ค.
Object.getOwnPropertyDescriptor(Object.prototpye, '__proto__');
//-> {get: f, set: f, enumerable: false, configurable: true}
์ property๋ฅผ ์ถ๊ฐํ๋ฉด์,
property attribute๋ฅผ ์๋ก ์ ์ํ๊ฑฐ๋ ๊ธฐ์กด์ property attribute๋ฅผ ์ฌ์ ์ํ๋ ๊ฒ์ ๋งํ๋ค!
๊ฐ์ฒด๋ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ ๊ฐ์ด๋ผ๊ณ ํ๋ค. (์ฌํ ๋น์ด ํ์ํ์ง ์๋ค)
property ์ถ๊ฐ, ์ญ์ , ๊ฐ ๊ฐฑ์ , attribute ์ฌ์ ์๊ฐ ๊ฐ๋ฅํ๋ค.
Object.preventExtensions ๊ฐ์ฒด ํ์ฅ ๊ธ์ง๊ฐ์ฒด ํ์ฅ์ ๊ธ์งํ๋ ๋ฉ์๋์ด๋ค.
property์ ์ถ๊ฐ๋ฅผ ๊ธ์งํ๋ค๋ ๊ฒ์ด๋ค.
property๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋
Object.defineProperty ๋ก ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ
๋๋ Property ๋์ ์ถ๊ฐ๋ฅผ ํ๋ ๋ฐฉ๋ฒ์ด ์๋๋ฐ, ๋ ๊ฐ์ง ๋ชจ๋๋ฅผ ๊ธ์งํ๋ค.
Object.isExtensible ๋ก ํ์ฅ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์๋ค.
Object.seal ๊ฐ์ฒด ๋ฐ๋ด๊ฐ์ฒด๋ฅผ ๋ฐ๋ดํ๋ ๋ฉ์๋์ด๋ค.
property๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ , attribute๋ฅผ ์ฌ์ ์ํ๋ ๊ฒ์ ๊ธ์งํ๋ค.
๊ทธ๋ฌ๋๊น ์ฝ๊ธฐ์ ์ฐ๊ธฐ๋ง ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด๋ค.
Object.isSealed ๋ก ๋ฐ๋ด ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์๋ค.
Object.freeze ๊ฐ์ฒด ๋๊ฒฐ๊ฐ์ฒด๋ฅผ ๋๊ฒฐํ๋ ๋ฉ์๋์ด๋ค.
property ์ถ๊ฐ, ์ญ์ , ๊ฐ ๊ฐฑ์ , attribute ์ฌ์ ์๊ฐ ๊ธ์ง๋๋ค.
์ค์ง ์ฝ๊ธฐ๋ง ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
Object.isFrozen ์ผ๋ก ๋๊ฒฐ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์๋ค.
์ฌ๊ธฐ๊น์ง์ ๋ฉ์๋๋ค์, ์์ ๋ณ๊ฒฝ๋ง์ ๋ฐฉ์งํ๋ ๋ฉ์๋์๋ค.
๊ทธ๋ฌ๋๊น ์ง์ property๋ง ๋ณ๊ฒฝ์ ๋ฐฉ์งํ๋ฉฐ, ์ค์ฒฉ๋ ๊ฐ์ฒด์ ๋ํด์๋ ์ํฅ์ ๋ฏธ์น์ง ๋ชปํ๋ค.
์ค์ฒฉ๊ฐ์ฒด๊น์ง ๋๊ฒฐํด์, ์์ ํ ๋ณ๊ฒฝ ๋ถ๊ฐํ ์ฝ๊ธฐ ์ ์ฉ์ ๋ถ๋ณ๊ฐ์ฒด๋ฅผ ๊ตฌํํ๋ ค๋ฉด ?
๋ชจ๋ property์ ์ฌ๊ท์ ์ผ๋ก Object.freeze ๋ฉ์๋๋ฅผ ํธ์ถํด์ฃผ๋ฉด ๋๋ค.
๋ณ์์ ์๋ช ์ฃผ๊ธฐ๊น์ง ์ฌ๋ฐ๊ฒ ๊ณต๋ถ๋ฅผ ํ๊ณ ์์๋๋ฐ, ๊ฐ์๊ธฐ property..?๋ก ํ๋ฆ์ด ๋ฐ๋์ด์ ํฅ๋ฏธ๊ฐ ์ด์ง ๋จ์ด์ง ์ํ์ด๋ค.
๊ทธ๋๋ '๊ทธ๋ ์ผ๋ง๋ ์ค์ํ๋ฉด ํ๋ฆ์ ๊นจ๊ณ ๊ฐ๋ ์ ๋ฃ์๊ฒ ์ด'ํ๋ ์๊ฐ์ ๋๋ฆ ์ดํดํ ํ๋ฆ์ผ๋ก ์ ๋ฆฌ๋ฅผ ํด๋ณด์๋ค.