๐ค ์์งlog ๐ค
ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ ๋ณธ๋ฌธ
๐ฃ ๋ด๋ถ ์ฌ๋กฏ๊ณผ ๋ด๋ถ ๋ฉ์๋
๋ ์๋ฐ์คํธ๋ฆฝํธ ์์ง์ ๊ตฌํ ์๊ณ ๋ฆฌ์ฆ์ ์ค๋ช ํ๊ธฐ ์ํด ECMAScript ์ฌ์์์ ์ฌ์ฉํ๋ ์์ฌ ํ๋กํผํฐ์ ์์ฌ ๋ฉ์๋ ๋ค.
์ด์ค ๋๊ดํธ [[...]]๋ก ๊ฐ์ผ ์ด๋ฆ๋ค์ด ๋ด๋ถ ์ฌ๋กฏ๊ณผ ๋ด๋ถ ๋ฉ์๋๋ค.
๋ด๋ถ ์ฌ๋กฏ๊ณผ ๋ด๋ถ ๋ฉ์๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋ด๋ถ ๋ก์ง์ด๋ฏ๋ก ์์น์ ์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ด๋ถ ์ฌ๋กฏ๊ณผ ๋ด๋ถ ๋ฉ์๋์ ์ง์ ์ ์ผ๋ก ์ ๊ทผํ๊ฑฐ๋ ํธ์ถํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง ์๋๋ค.
๐ฃ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ์ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ํ๋กํผํฐ๋ฅผ ์์ฑํ ๋ ํ๋กํผํฐ์ ์ํ๋ฅผ ๋ํ๋ด๋ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ
๊ธฐ๋ณธ๊ฐ์ผ๋ก ์๋ ์ ์ ํ๋ค. (ํ๋กํผํฐ์ ์ํ๋ ํ๋กํผํฐ์ ๊ฐ, ๊ฐ์ ๊ฐฑ์ ๊ฐ๋ฅ ์ฌ๋ถ, ์ด๊ฑฐ ๊ฐ๋ฅ ์ฌ๋ถ, ์ฌ์ ์ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ๋งํ๋ค.)
ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ๊ด์ดํ๋ ๋ด๋ถ ์ํ ๊ฐ์ธ ๋ด๋ถ ์ฌ๋กฏ [[value]], [[Writalbe]], [[Enumerablr]], [[Configuralbe]] ์ด๋ค.
- ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ์ ์ง์ ์ ๊ทผํ ์ ์์ง๋ง Object.getOwnPropertyDescriptor ๋ฉ์๋ ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ ์ผ๋ก ํ์ธํ ์ ์๋ค.
- Object.getOwnPropertyDescriptor ๋ฉ์๋๋ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด ๋ฅผ ๋ฐํํ๋ค.
const person = {
name: 'Lee'
};
// ํ๋กํผํฐ ๋์ ์์ฑ
person.age = 20;
console.log(Object.getOwnPropertyDescriptors(person));
/*
{
name: {value: 'Lee', writable: true, enumerable: true, configurable: true}
age: {value: 20, writable: true, enumerable: true, configurable: true}
[[Prototype]]: Object
}
*/
๐ฃ ๋ฐ์ดํฐ ํ๋กํผํฐ์ ์ ๊ทผ์ ํ๋กํผํฐ
ํ๋กํผํฐ๋ ๋ฐ์ดํฐ ํ๋กํผํฐ์ ์ ๊ทผ์ ํ๋กํผํฐ๋ก ๊ตฌ๋ถํ ์ ์๋ค.
- ๋ฐ์ดํฐ ํ๋กํผํฐ : ํค์ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋ ์ผ๋ฐ์ ์ธ ํ๋กํผํฐ๋ค.
- ์ ๊ทผ์ ํ๋กํผํฐ : ์์ฒด์ ์ผ๋ก๋ ๊ฐ์ ๊ฐ์ง ์๊ณ ๋ค๋ฅธ ๋ฐ์ดํฐ ํ๋กํผํฐ์ ๊ฐ์ ์ฝ๊ฑฐ๋ ์ ์ฅํ ๋ ํธ์ถ๋๋ ์ ๊ทผ์ ํจ์๋ก ๊ตฌ์ฑ๋ ํ๋กํผํฐ ์ด๋ค.
๋ฐ์ดํฐ ํ๋กํผํฐ
const person = {
name: 'Lee'
};
console.log(Object.getOwnPropertyDescriptor(person,'name'));
// {value: 'Lee', writable: true, enumerable: true, configurable: true}
์ ๊ทผ์ ํ๋กํผํฐ
์ ๊ทผ์ ํจ์๋ getter/setter ํจ์๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค. ์ ๊ทผ์ ํ๋กํผํฐ๋ getter๊ณผ setter ํจ์๋ฅผ ๋ชจ๋ ์ ์ํ ์๋ ์๊ณ ํ๋๋ง ์ ์ํ ์๋ ์๋ค.
์ ๊ทผ์ ํ๋กํผํฐ์ ๋ฐ์ดํฐ ํ๋กํผํฐ๋ฅผ ๊ตฌ๋ถํ๋ ๋ฐฉ๋ฒ
// ์ผ๋ฐ ๊ฐ์ฒด์ __proto__๋ ์ ๊ทผ์ ํ๋กํผํฐ ๋ค.
Object.getOwnPropertyDescriptor(Object.prototype,'__proto__');
// {enumerable: false, configurable: true, get: ƒ, set: ƒ}
// ํจ์ ๊ฐ์ฒด์ prototype์ ๋ฐ์ดํฐ ํ๋กํผํฐ ๋ค.
Object.getOwnPropertyDescriptor(function() {},'prototype');
// {value: {…}, writable: true, enumerable: false, configurable: false}
๐ฃ ํ๋กํผํฐ ์ ์
ํ๋กํผํฐ ์ ์๋ ์๋ก์ด ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ๋ฉด์ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๋ช
์์ ์ผ๋ก ์ ์ํ๊ฑฐ๋, ๊ธฐ์กด ํ๋กํผํฐ์ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ฌ์ ์ ํ๋๊ฒ์ ๋งํ๋ค.
Object.defineProperty ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋กํผํฐ์ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ ์ํ ์ ์๋ค. ์ธ์๋ก๋ ๊ฐ์ฒด์ ์ฐธ์กฐ์ ๋ฐ์ดํฐ ํ๋กํผํฐ์ key์ธ ๋ฌธ์์ด, ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๋ค.
- Object.defineProperty ๋ฉ์๋๋ ํ๋ฒ์ ํ๋์ ํ๋กํผํฐ๋ง ์ ์ํ ์ ์๋ค.
- Object.defineProperties ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ๊ฐ์ ํ๋กํผํฐ๋ฅผ ํ ๋ฒ์ ์ ์ํ ์ ์๋ค.
๐ฃ ๊ฐ์ฒด ๋ณ๊ฒฝ ๋ฐฉ์ง
๊ฐ์ฒด ํ์ฅ ๊ธ์ง
Object.preventExtentions ๋ฉ์๋๋ ๊ฐ์ฒด์ ํ์ฅ์ ๊ธ์ง ํ๋ค. ( ๊ฐ์ฒด ํ์ฅ ๊ธ์ง๋ ํ๋กํผํฐ ์ถ๊ฐ ๊ธ์ง๋ฅผ ์๋ฏธํ๋ค. - ํ์ฅ์ด ๊ธ์ง๋ ๊ฐ์ฒด๋ ํ๋กํผํฐ ์ถ๊ฐ๊ฐ ๊ธ์ง๋๋ค.)
- ํ๋กํผํฐ๋ ํ๋กํผํฐ ๋์ ์ถ๊ฐ์ Object.defineProperty ๋ฉ์๋๋ก ์ถ๊ฐํ ์ ์์ง๋ง ์ด ๋๊ฐ์ง ์ถ๊ฐ ๋ฐฉ๋ฒ์ด ๋ชจ๋ ๊ธ์ง๋๋ค.
๊ฐ์ฒด ๋ฐ๋ด
Object.seal ๋ฉ์๋๋ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ดํ๋ค. ( ๊ฐ์ฒด ๋ฐ๋ด ์ด๋ ํ๋กํผํฐ ์ถ๊ฐ ๋ฐ ์ญ์ ์ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ ์ฌ์ ์ ๊ธ์ง๋ฅผ ์๋ฏธํ๋ค. )
- ๋ฐ๋ด๋ ๊ฐ์ฒด๋ ์ฝ๊ธฐ์ ์ฐ๊ธฐ๋ง ๊ฐ๋ฅํ๋ค.
๊ฐ์ฒด ๋๊ฒฐ
Object.freeze ๋ฉ์๋๋ ๊ฐ์ฒด๋ฅผ ๋๊ฒฐํ๋ค. ( ๊ฐ์ฒด ๋๊ฒฐ ์ด๋ ํ๋กํผํฐ ์ถ๊ฐ ๋ฐ ์ญ์ ์ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ ์ฌ์ ์ ๊ธ์ง, ํ๋กํผํฐ ๊ฐ ๊ฐฑ์ ๊ธ์ง๋ฅผ ์๋ฏธํ๋ค. )
- ๋๊ฒฐ๋ ๊ฐ์ฒด๋ ์ฝ๊ธฐ๋ง ๊ฐ๋ฅํ๋ค.
'๐ ๋ชจ๋Javascript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํจ์์ ์ผ๊ธ ๊ฐ์ฒด (0) | 2022.09.28 |
---|---|
์์ฑ์ ํจ์์ ์ํ ๊ฐ์ฒด ์์ฑ (0) | 2022.09.28 |
์ค์ฝํ (Scope) (0) | 2022.09.28 |
ํจ์ (0) | 2022.09.28 |
์์๊ฐ๊ณผ ๊ฐ์ฒด ๋น๊ต (0) | 2022.09.28 |