ํฐ์คํ ๋ฆฌ ๋ทฐ
[JavaScript] ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ
๊ฐ๋ฐ๊ฐ๊ตด๐ธ 2022. 7. 21. 21:49๋ด๋ถ ์ฌ๋กฏ(internal slot)๊ณผ ๋ด๋ถ ๋ฉ์๋(internal method)๋?
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๊ตฌํ ์๊ณ ๋ฆฌ์ฆ์ ์ค๋ช ํ๊ธฐ ์ํด ECMAScript ์ฌ์์์ ์ฌ์ฉํ๋ ์์ฌ ํ๋กํผํฐ์ ์์ฌ ๋ฉ์๋๋ก,
์ด์ค ๋๊ดํธ ([[ ... ]])๋ก ๊ฐ์ผ ์ด๋ฆ๋ค์ด ๋ด๋ถ ์ฌ๋กฏ๊ณผ ๋ด๋ถ ๋ฉ์๋์ ๋๋ค.
const o = {};
o.[[Prototype]] // -> Uncaught SyntaxError
0.__proto__ // -> Object.prototype
์์ ์์ ์ ๊ฐ์ด ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋ด๋ถ ๋ก์ง์ธ ๋ด๋ถ ์ฌ๋กฏ๊ณผ ๋ด๋ถ ๋ฉ์๋๋ ์ง์ ์ ์ผ๋ก ์ ๊ทผํ๊ฑฐ๋ ํธ์ถํ ์ ์์ง๋ง,
[[Prototype]] ๋ด๋ถ ์ฌ๋กฏ์ ๊ฒฝ์ฐ __proto__๋ฅผ ํตํด ๊ฐ์ ์ ์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅํ ๊ฒ ์ฒ๋ผ ์ผ๋ถ๋ ์ ๊ทผ ์๋จ์ ์ ๊ณตํฉ๋๋ค.
ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ์ ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ํ๋กํผํฐ๋ฅผ ์์ฑํ ๋ ํ๋กํผํฐ์ ์ํ๋ฅผ ๋ํ๋ด๋ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์๋ ์ ์ํฉ๋๋ค.
- ํ๋กํผํฐ ์ํ : ํ๋กํผํฐ์ ๊ฐ(value), ๊ฐ์ ๊ฐฑ์ ์ฌ๋ถ(writable), ์ด๊ฑฐ ๊ฐ๋ฅ ์ฌ๋ถ(enumerable), ์ฌ์ ์ ๊ฐ๋ฅ ์ฌ๋ถ(configurable)
- ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ : ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ๊ด๋ฆฌํ๋ ๋ด๋ถ ์ํ ๊ฐ์ธ ๋ด๋ถ ์ฌ๋กฏ. [[Value]], [[Writable]] , [[Enumerable]] , [[Configurable]]
const person = {
name: 'Lee'
};
// ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด ๋ฐํ
console.log(Object.getOwnPropertyDescriptor(person, 'name'));
// {value: "Lee", writable: true, enumerable: true, configurable: true}
// ํ๋กํผํฐ ๋์ ์์ฑ
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}
ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด๋ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๊ฐ์ฒด๋ก Object.getOwnPropertyDescriptor ๋ฉ์๋๋ ํ๋์ ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ณ , Object.getOwnPropertyDescriptors ๋ฉ์๋๋ ๋ชจ๋ ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด๋ค์ ๋ฐํํฉ๋๋ค. ๋ง์ฝ, ์กด์ฌํ์ง ์๋ ํ๋กํผํฐ๋ผ๋ฉด undefined๋ฅผ ๋ฐํํฉ๋๋ค.
๋ฐ์ดํฐ ํ๋กํผํฐ์ ์ ๊ทผ์ ํ๋กํผํฐ
ํ๋กํผํฐ๋ ๋ฐ์ดํฐ ํ๋กํผํฐ์ ์ ๊ทผ์ ํ๋กํผํฐ๋ก ๊ตฌ๋ถํ ์ ์์ต๋๋ค.
๋ฐ์ดํฐ ํ๋กํผํฐ
ํค์ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋ ์ผ๋ฐ์ ์ธ ํ๋กํผํฐ๋ก ๋ค์๊ณผ ๊ฐ์ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๊ฐ์ง๋๋ค.
ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ | ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด์ ํ๋กํผํฐ | ์ค๋ช |
[[Value]] | value | - ํ๋กํผํฐ ํค๋ฅผ ํตํด ํ๋กํผํฐ ๊ฐ์ ์ ๊ทผํ๋ฉด ๋ฐํ๋จ - ํ๋กํผํฐ ํค๋ฅผ ํตํด ํ๋กํผํฐ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด [[Value]]์ ๊ฐ์ ์ฌํ ๋นํ๊ฑฐ๋ ํ๋กํผํฐ๊ฐ ์์ผ๋ฉด ํ๋กํผํฐ๋ฅผ ๋์ ์์ฑํ๊ณ ์์ฑ๋ ํ๋กํผํฐ์ [[Value]]์ ๊ฐ์ ์ ์ฅ |
[[Writable]] | writable | - ํ๋กํผํฐ ๊ฐ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ๋ถ๋ฆฌ์ธ ๊ฐ - [[Writable]]์ ๊ฐ์ด false๋ฉด, [[Value]]๊ฐ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ์ฝ๊ธฐ ์ ์ฉ ํ๋กํผํฐ |
[[Enumerable]] | enumerable | - ํ๋กํผํฐ์ ์ด๊ฑฐ ๊ธฐ๋ฅ ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ๋ถ๋ฆฌ์ธ ๊ฐ - [[Enumerable]]์ ๊ฐ์ด false๋ฉด, ํด๋น ํ๋กํผํฐ๋ for ... in๋ฌธ์ด๋ Object.keys ๋ฉ์๋ ๋ฑ์ผ๋ก ์ด๊ฑฐํ ์ ์์ |
[[Configurable]] | configurable | - ํ๋กํผํฐ์ ์ฌ์ ์ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ๋ถ๋ฆฌ์ธ ๊ฐ - [[Configurable]]์ ๊ฐ์ด false๋ฉด, ํด๋น ํ๋กํผํฐ๋ฅผ ์ญ์ ํ๊ฑฐ๋ ์ดํธ๋ฆฌ๋ทฐํธ ๊ฐ์ ๋ณ๊ฒฝ์ด ๊ธ์ง๋จ. (๋จ, [[Writable]]์ด true์ธ ๊ฒฝ์ฐ [[Value]]์ [[Writable]]์ ๊ฐ ๋ณ๊ฒฝ ์ ๊ฐ๋ฅ) |
์ ๊ทผ์ ํ๋กํฐํผ
์์ฒด์ ์ผ๋ก๋ ๊ฐ์ ๊ฐ์ง ์๊ณ ๋ค๋ฅธ ๋ฐ์ดํฐ ํ๋กํผํฐ์ ๊ฐ์ ์ฝ๊ฑฐ๋ ์ ์ฅํ ๋ ํธ์ถ๋๋ ์ ๊ทผ์ ํจ์๋ก ๊ตฌ์ฑ๋ ํ๋กํผํฐ๋ก ๋ค์๊ณผ ๊ฐ์ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๊ฐ์ง๋๋ค.
ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ | ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด์ ํ๋กํผํฐ | ์ค๋ช |
[[Get]] | get | - ๋ฐ์ดํฐ ํ๋กํผํฐ ๊ฐ์ ์ฝ์ ๋ ํธ์ถ๋๋ ์ ๊ทผ์ ํจ์ - ์ ๊ทผ์ ํ๋กํผํฐ ํค๋ก ํ๋กํผํฐ ๊ฐ์ ์ ๊ทผํ๋ฉด ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ [[Get]]์ ๊ฐ, ์ฆ getter ํจ์๊ฐ ํธ์ถ๋๊ณ ๊ทธ ๊ฒฐ๊ณผ๊ฐ ํ๋กํผํฐ ๊ฐ์ผ๋ก ๋ฐํ๋จ |
[[Set]] | set | - ๋ฐ์ดํฐ ํ๋กํผํฐ์ ๊ฐ์ ์ ์ฅํ ๋ ํธ์ถ๋๋ ์ ๊ทผ์ ํจ์ - ์ ๊ทผ์ ํ๋กํผํฐ ํค๋ก ํ๋กํผํฐ ๊ฐ์ ์ ์ฅํ๋ฉด ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํฐ [[Set]]์ ๊ฐ, ์ฆ setterํจ์๊ฐ ํธ์ถ๋๊ณ ๊ทธ ๊ฒฐ๊ณผ๊ฐ ํ๋กํผํฐ ๊ฐ์ผ๋ก ์ ์ฅ๋จ |
[[Enumerable]] | enumerable | - ๋ฐ์ดํฐ ํ๋กํผํฐ์ [[Enumerable]]๊ณผ ๊ฐ์ |
[[Configurable]] | configurable | - ๋ฐ์ดํฐ ํ๋กํผํฐ์ [[Configurable]]๊ณผ ๊ฐ์ |
์ ๊ทผ์ ํจ์๋ getter/setter ํจ์๋ผ๊ณ ๋ ๋ถ๋ฆ ๋๋ค. ์ ๊ทผ์ ํ๋กํผํฐ๋ getter์ setter ํจ์๋ฅผ ๋ชจ๋ ์ ์ํ ์๋ ์๊ณ ํ๋๋ง ์ ์ํ ์๋ ์์ต๋๋ค.
const person = {
// ๋ฐ์ดํฐ ํ๋กํผํฐ
fistName: 'Ungmo',
lastName: 'Lee'
// fullName์ ์ ๊ทผ์ ํจ์๋ก ๊ตฌ์ฑ๋ ์ ๊ทผ์ ํ๋กํผํฐ
// getter ํจ์
get fullName() {
return `${this.fistName} ${this.lasName}`;
},
// setter ํจ์
set fullName(name) {
// ๋ฐฐ์ด ๋์คํธ๋ญ์ฒ๋ง ํ ๋น
[this.fistName, this.lasName] = name.split(' ');
}
};
// ๋ฐ์ดํฐ ํ๋กํผํฐ๋ฅผ ํตํ ํ๋กํผํฐ ๊ฐ์ ์ฐธ์กฐ
console.log(person.firstName + ' ' + person.lastName); // Ungmo Lee
// ์ ๊ทผ์ ํ๋กํผํฐ๋ฅผ ํตํ ํ๋กํผํฐ ๊ฐ์ ์ ์ฅ
// ์ ๊ทผ์ ํ๋กํผํฐ fullName์ ๊ฐ์ ์ ์ฅํ๋ฉด setter ํจ์๊ฐ ํธ์ถ๋จ
person.fullName = 'Heegun Lee';
console.log(person); // {fistName: "Heegun", lastName: "Lee"}
// ์ ๊ทผ์ ํ๋กํผํฐ๋ฅผ ํตํ ํ๋กํผํฐ ๊ฐ์ ์ฐธ์กฐ
// ์ ๊ทผ์ ํ๋กํผํฐ fullName์ ์ ๊ทผํ๋ฉด getter ํจ์๊ฐ ํธ์ถ๋จ
console.log(person.fullName); // Heegun Lee
ํ๋กํผํฐ ์ ์
์๋ก์ด ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ๋ฉด์ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๋ช ์์ ์ผ๋ก ์ ์ํ๊ฑฐ๋, ๊ธฐ์กด ํ๋กํผํฐ์ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ฌ์ ์ ํ๋๊ฒ์ ๋งํฉ๋๋ค.
- ๊ฐ์ฒด์ ํ๋กํผํฐ๊ฐ ์ด๋ป๊ฒ ๋์ํด์ผ ํ๋์ง ๋ช ํํ ์ ์ ๊ฐ๋ฅ
- Object.defineProperty ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ํ๋กํผํฐ์ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ ์
(์ธ์๋ก ๊ฐ์ฒด์ ์ฐธ์กฐ์ ๋ฐ์ดํฐ ํ๋กํผํฐ์ ํค์ธ ๋ฌธ์์ด, ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด๋ฅผ ์ ๋ฌ)
const person = {};
// ๋ฐ์ดํฐ ํ๋กํผํฐ ์ ์
Object.defineProperty(person, 'firstName', {
value: 'Ungmo',
writable: true,
enumerable: true,
configurable: true
});
let descriptor = Object.getOwnPropertyDescriptor(person, 'firstName');
console.log('firstName', descriptor);
// lastName {value: "Ungmo", writable: true, enumerable: true, configurable: true}
Object.defineProperty ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ํ๋กํผํฐ๋ฅผ ์ ์ํ ๋ ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด์์ ์๋ต๋ ์ดํธ๋ฆฌ๋ทฐํธ๋ ๋ค์๊ณผ ๊ฐ์ด ๊ธฐ๋ณธ๊ฐ์ด ์ ์ฉ๋ฉ๋๋ค.
ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด์ ํ๋กํผํฐ | ๋์ํ๋ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ | ์๋ตํ์ ๋์ ๊ธฐ๋ณธ๊ฐ |
value | [[Value]] | undefined |
get | [[Get]] | undefined |
set | [[Set]] | undefined |
writable | [[Writable]] | false |
enumberable | [[Enumberable]] | false |
configurable | [[Conrigurable]] | false |
๊ฐ์ฒด ๋ณ๊ฒฝ ๋ฐฉ์ง
๊ฐ์ฒด๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฐ์ด๋ฏ๋ก ์ฌํ ๋น ์์ด ์ง์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์ฆ, ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ ์ ์๊ณ , ํ๋กํผํฐ ๊ฐ์ ๊ฐฑ์ ํ ์ ์์ผ๋ฉฐ, Object.defineProperty ๋๋ Object.defineProperties ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ฌ์ ์ ํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ณ๊ฒฝ ๊ธ์ง ๊ฐ๋์ ๋ฐ๋ผ ๊ฐ์ฒด์ ๋ณ๊ฒฝ์ ๋ฐฉ์งํ๋ ๋ค์ํ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
๊ตฌ๋ถ | ๋ฉ์๋ | ํ๋กํผํฐ ์ถ๊ฐ | ํ๋กํผํฐ ์ญ์ | ํ๋กํผํฐ ๊ฐ ์ฝ๊ธฐ | ํ๋กํผํฐ ๊ฐ ์ฐ๊ธฐ | ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ ์ฌ์ ์ |
๊ฐ์ฒด ํ์ฅ ๊ธ์ง | Object.preventExtenstions | X | O | O | O | O |
๊ฐ์ฒด ๋ฐ๋ด | Object.seal | X | X | O | O | X |
๊ฐ์ฒด ๋๊ฒฐ | Object.freeze | X | X | O | X | X |
// ๊ฐ์ฒด ํ์ฅ ๊ธ์ง : ํ๋กํผํฐ ์ถ๊ฐ๊ฐ ๊ธ์ง
Object.perventExtensions(obejct);
Object.isExtensible(object); // true || false๋ก ํ์ฅ ๊ธ์ง ๊ฐ์ฒด์ธ์ง ํ์ธ
// ๊ฐ์ฒด ๋ฐ๋ด : ์ฝ๊ธฐ์ ์ฐ๊ธฐ๋ง ๊ฐ๋ฅ
Object.seal(obejct);
Object.isSealed(object); // true || false๋ก ๋ฐ๋ด ๊ฐ์ฒด์ธ์ง ํ์ธ
// ๊ฐ์ฒด ๋๊ฒฐ : ์ฝ๊ธฐ๋ง ๊ฐ๋ฅ
Object.freeze(obejct);
Object.isFrozen(object); // true || false๋ก ๋๊ฒฐ ๊ฐ์ฒด์ธ์ง ํ์ธ
๋ถ๋ณ ๊ฐ์ฒด
์ง๊ธ ๊น์ง ์ดํด๋ณธ ๋ณ๊ฒฝ ๋ฐฉ์ง ๋ฉ์๋๋ค์ ์์ ๋ณ๊ฒฝ ๋ฐฉ์ง๋ก ์ง์ ํ๋กํผํฐ๋ง ๋ณ๊ฒฝ์ด ๋ฐฉ์ง๋๊ณ ์ค์ฒฉ ๊ฐ์ฒด๊น์ง๋ ์ํฅ์ ์ฃผ์ง ๋ชปํฉ๋๋ค. ๋ฐ๋ผ์ ๊ฐ์ฒด์ ์ค์ฒฉ ๊ฐ์ฒด๊น์ง ๋๊ฒฐํ์ฌ ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ๊ตฌํํ๋ ค๋ฉด ๊ฐ์ฒด๋ฅผ ๊ฐ์ผ๋ก ๊ฐ๋ ๋ชจ๋ ํ๋กํผํฐ์ ๋ํด ์ฌ๊ท์ ์ผ๋ก Object.freeze ๋ฉ์๋๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค.
function deepFreeze(targe) {
// ๊ฐ์ฒด๊ฐ ์๋๊ฑฐ๋ ๋๊ฒฐ๋ ๊ฐ์ฒด๋ ๋ฌด์
if(target && typeof target === 'object' && !Object.isFrozen(target)) {
Object.freeze(target);
Object.keys(target).forEach(key => deepFreeze(target[key]));
}
return target;
}
[์ถ์ฒ] ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive
'JavaScript > ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JavaScript] ํจ์์ ์ผ๊ธ ๊ฐ์ฒด (0) | 2022.07.22 |
---|---|
[JavaScript] ์์ฑ์ ํจ์์ ์ํ ๊ฐ์ฒด ์์ฑ (0) | 2022.07.22 |
[JavaScript] let, const ํค์๋์ ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ (0) | 2022.07.21 |
[JavaScript] ์ ์ญ ๋ณ์์ ๋ฌธ์ ์ (0) | 2022.07.21 |
[JavaScript] ์ค์ฝํ (0) | 2022.07.20 |
- Total
- Today
- Yesterday
- JavaScript
- ์นด์นด์ค ์ธํด
- ํ๋กํ ์ฝ
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
- ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ
- ์๊ณ ๋ฆฌ์ฆ
- ๋ ์์ปฌ ํ๊ฒฝ
- ์ด์์ฒด์
- ํ๋กํผํฐ
- ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ deep dive
- map
- ์ด๋ถํ์
- 2019 ์นด์นด์ค ๊ฐ๋ฐ์ ๊ฒจ์ธ ์ธํด
- ๋ฐฑ์ค node.js
- ์๋ฐ
- ์ ์ญ ๋ณ์
- TDD
- fp
- ๋คํธ์ํฌ
- ๋์์ธ ํจํด
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
- ํ๋ก๊ทธ๋๋จธ์ค
- ์ฝ๋ฉํ ์คํธ
- ๋ฐฑ์ค
- http
- Baekjoon
- ํฌํฌ์ธํฐ
- ๋ฐฑ์ค javascript
- ์๋ฐ์คํฌ๋ฆฝํธ
- git
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |