๋ด๋ถ ์ฌ๋กฏ
๊ณผ๋ด๋ถ ๋ฉ์๋
๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๊ตฌํ ์๊ณ ๋ฆฌ์ฆ์ ์ค๋ช ํ๊ธฐ ์ํด ECMAScript ์ฌ์์์ ์ฌ์ฉํ๋์์ฌ ํ๋กํผํฐ
์์์ฌ ๋ฉ์๋
๋ค. ECMAScript ์ฌ์์ ๋ฑ์ฅํ๋ ์ด์ค ๋๊ดํธ[[..]]
๋ก ๊ฐ์ผ ์ด๋ฆ๋ค์ด๋ด๋ถ ์ฌ๋กฏ
๊ณผ๋ด๋ถ ๋ฉ์๋
๋ค.
๋ด๋ถ ์ฌ๋กฏ
๊ณผ๋ด๋ถ ๋ฉ์๋
๋ ECMAScript ์ฌ์์ ์ ์๋ ๋๋ก ๊ตฌํ๋์ด ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์์ ์ค์ ๋ก ๋์ํ์ง๋ง ๊ฐ๋ฐ์๊ฐ ์ง์ ์ ๊ทผํ ์ ์๋๋ก ์ธ๋ถ๋ก ๊ณต๊ฐ๋ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ ์๋๋ค. ๋จ, ์ผ๋ถ๋ด๋ถ ์ฌ๋กฏ
๊ณผ๋ด๋ถ ๋ฉ์๋
์ ํํ์ฌ ๊ฐ์ ์ ์ผ๋ก ์ ๊ทผํ ์ ์๋ ์๋จ์ ์ ๊ณตํ๊ธฐ๋ ํ๋ค.
const o = {};
// ๋ด๋ถ ์ฌ๋กฏ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋ด๋ถ ๋ก์ง์ด๋ฏ๋ก ์ง์ ์ ๊ทผํ ์ ์๋ค.
o.[[Prototype]] // Uncaught SyntaxError : Unexpected token '['
// ๋จ, ์ผ๋ถ ๋ด๋ถ ์ฌ๋กฏ๊ณผ ๋ด๋ถ ๋ฉ์๋์ ํํ์ฌ ๊ฐ์ ์ ์ผ๋ก ์ ๊ทผํ ์ ์๋ ์๋จ์ ์ ๊ณตํ๊ธฐ๋ ํ๋ค.
o.__proto__ // Object.prototype
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ํ๋กํผํฐ๋ฅผ ์์ฑํ ๋ ํ๋กํผํฐ์ ์ํ๋ฅผ ๋ํ๋ด๋ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๊ธฐ๋ณธ๊ฐ์ ์๋ ์ ์ํ๋ค.
ํ๋กํผํฐ์ ์ํ
๋ํ๋กํผํฐ์ ๊ฐ
๊ฐ์ ๊ฐฑ์ ๊ฐ๋ฅ ์ฌ๋ถ
์ด๊ฑฐ ๊ฐ๋ฅ ์ฌ๋ถ
์ฌ์ ์ ๊ฐ๋ฅ ์ฌ๋ถ
๋ฅผ ๋งํ๋ค.
ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ
๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ๊ด๋ฆฌํ๋ ๋ด๋ถ ์ํ ๊ฐ์ธ ๋ด๋ถ ์ฌ๋กฏ[[Value]]
[[Enumerable]]
[[Configurable]]
์ด๋ค. ๋ฐ๋ผ์ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ
์ ์ง์ ์ ๊ทผํ ์ ์์ง๋งObject.getOwnPropertyDescriptor
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ ์ผ๋ก ํ์ธํ ์๋ ์๋ค.
Object.getOwnPropertyDescriptor
๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์์๋ ๊ฐ์ฒด์ ์ฐธ์กฐ๋ฅผ ์ ๋ฌ, ๋๋ฒ์งธ ๋งค๊ฐ๋ณ์์๋ ํ๋กํผํฐ ํค๋ฅผ ๋ฌธ์์ด๋ก ์ ๋ฌ ์ด๋Object.getOwnPropertyDescriptor
๋ฉ์๋๋ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด
๋ฅผ ๋ฐํํ๋ค.
ES8์์ ๋์ ๋Object.getOwnPropertyDescriptor
๋ฉ์๋๋ ๋ชจ๋ ํ๋กํผํฐ์ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ ๊ณตํ๋ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด
๋ค์ ๋ฐํํ๋ค.
const person = {
name : "Lee"
};
// ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
console.log(Object.getOwnPropertyDescriptor(person, 'name'));
// {value : "Lee", writable: true, enumerable: true, configurable: true}
// ํ๋กํผํฐ ๋์ ์์ฑ
person.age = 20;
// ๋ชจ๋ ํ๋กํผํฐ์ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด๋ค์ ๋ฐํํ๋ค.
console.log(Object.getOwnPropertyDescriptor(person));
//{ name: {value : "Lee", writable: true, enumerable: true, configurable: true}
// age: {value : "20", writable: true, enumerable: true, configurable: true} }
ํ๋กํผํฐ๋ ๋ฐ์ดํฐ ํ๋กํผํฐ์ ์ ๊ทผ์ ํ๋กํผํฐ๋ก ๊ตฌ๋ถํ ์ ์๋ค.
const person = {
name : "Lee"
};
// ํ๋กํผํฐ ๋์ ์์ฑ
person.age = 20;
console.log(Object.getOwnPropertyDescriptor(person));
//{ name: {value : "Lee", writable: true, enumerable: true, configurable: true}
// age: {value : "20", writable: true, enumerable: true, configurable: true} }
Object.getOwnPropertyDescriptor
๋ฉ์๋๊ฐ ๋ฐํํ ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด๋ฅผ ์ดํด๋ณด๋ฉด value์ ๊ฐ์ "Lee" ์ด๊ฒ์ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ[[value]]
์ ๊ฐ์ด "Lee"์ธ ๊ฒ์ ์๋ฏธ. ๊ทธ๋ฆฌ๊ณ writable, enumerable, configurable ํ๋กํผํฐ์ ๊ฐ์ ๋ชจ๋ true๋ค. ์ด๊ฒ์ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ[[Writable]]
[[Enumerable]]
[[Cinfigurable]]
์ ๊ฐ์ด ๋ชจ๋ true์ธ ๊ฒ์ ์๋ฏธ
ํ๋กํผํฐ๊ฐ ์์ฑ๋ ๋[[value]]
์ ๊ฐ์ ํ๋กํผํฐ ๊ฐ์ ์ด๊ธฐํ๋๋ฉฐ[[Writable]]
[[Enumerable]]
[[Cinfigurable]]
์ ๊ฐ์ true๋ก ์ด๊ธฐํ๋๋ฉฐ ํ๋กํผํฐ๋ฅผ ๋์ ์ถ๊ฐํด๋ ๋ง์ฐฌ๊ฐ์ง
getter/setter
ํจ์๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค. ์ ๊ทผ์ ํ๋กํผํฐ๋ getter
์ setter
ํจ์๋ฅผ ๋ชจ๋ ์ ์ํ ์๋ ์๊ณ ํ๋๋ง ์ ์ํ ์ ์๋ค.const person = {
// ๋ฐ์ดํฐ ํ๋กํผํฐ
firstName : "Noh",
lastName: "YoungWan",
// fullName์ ์ ๊ทผ์ ํจ์๋ก ๊ตฌ์ฑ๋ ์ ๊ทผ์ ํ๋กํผํฐ๋ค.
// getter ํจ์
get fullName() {
return `${this.firstName} ${this.lastName}`'
},
// setter ํจ์
set fullName(name) {
[this.firstName, this.lastName] = name.split('');
}
};
// ๋ฐ์ดํฐ ํ๋กํผํฐ๋ฅผ ํตํ ํ๋กํผํฐ์ ๊ฐ์ ์ฐธ์กฐ
console.log(person.firstName + '' + person.lastName); // Noh YoungWan
// ์ ๊ทผ์ ํ๋กํผํฐ๋ฅผ ํตํ ํ๋กํผํฐ ๊ฐ์ ์ ์ฅ
// ์ ๊ทผ์ ํ๋กํผํฐ fullName์ ๊ฐ์ ์ ์ฅํ๋ฉด setter ํจ์๊ฐ ํธ์ถ๋๋ค.
person.fullName = "YoungWan Noh";
console.log(person); // {firstName: "YoungWan", lastName: "Noh"}
// ์ ๊ทผ์ ํ๋กํผํฐ๋ฅผ ํตํ ํ๋กํผํฐ ๊ฐ์ ์ฐธ์กฐ
// ์ ๊ทผ์ ํ๋กํผํฐ fullName์ ์ ๊ทผํ๋ฉด getter ํจ์๊ฐ ํธ์ถ๋๋ค.
console.log(person.fullName); // YoungWan Noh
// firstName์ ๋ฐ์ดํฐ ํ๋กํผํฐ๋ค
// ๋ฐ์ดํฐ ํ๋กํผํฐ๋ [[Value]], [[Writable]], [[Enumerable]],[[Configurable]]
// ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๊ฐ๋๋ค
// fullName์ ์ ๊ทผ์ ํ๋กํผํฐ๋ค.
// ์ ๊ทผ์ ํ๋กํผํฐ๋ [[Get
let descriptor = Object.getOwnPropertyDescriptor(person, 'firstName');
console.log(descriptor)
// {get: f, set: f, enumerable: true, configurable: true}
[[value]]
)์ ๊ฐ์ง์ง ์์ผ๋ฉฐ ๋ค๋ง ๋ฐ์ดํฐ ํ๋กํผํธ์ ๊ฐ์ ์ฝ๊ฑฐ๋ ์ ์ฅํ ๋ ๊ด์ฐํ ๋ฟ์ด๋ค.ํ๋กํผํฐ ์ ์๋? ์๋ก์ด ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ๋ฉด์ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๋ช ์์ ์ผ๋ก ์ ์ํ๊ฑฐ๋, ๊ธฐ์กด ํ๋กํผํฐ์ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ฌ์ ์ ํ๋ ๊ฒ์ ๋งํ๋ค.
Object.defineProperty
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋กํผํฐ์ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ ์ํ ์ ์๋ค. ์ธ์๋ก๋ ๊ฐ์ฒด์ ์ฐธ์กฐ์ ๋ฐ์ดํฐ ํ๋กํผํฐ์ ํค์ธ ๋ฌธ์์ด, ํ๋กํผํฐ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๋ค.
const person = {};
// ๋ฐ์ดํฐ ํ๋กํผํฐ ์ ์
Object.defineProperty(person, 'firstName', {
value: "Noh",
writable: true,
enumerable: true,
configurable: true
});
Object.defineProperty(person, 'lastName', {
value: "YoungWan"
});
let descriptor = Object.getOwnPropertyDescriptor(person, 'firstName');
console.log('firstName', descriptor)
// firstName {value: "Noh", writable: true, enumerable: true, configurable: true }
descriptor = Object.getOwnPropertyDescriptor(person, 'lastName');
// ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ๋๋ฝ์ํค๋ฉด undefined, false๊ฐ ๊ธฐ๋ณธ๊ฐ์ด๋ค.
cosole.log('lastName', descriptor)
// lastName {value: "YoungWan", writable: false, enumnerable: false, configurable: fasle }
// [[Enumerable]]์ ๊ฐ์ด fasle์ธ ๊ฒฝ์ฐ
// ํด๋น ํ๋กํผํฐ๋ for..in ๋ฌธ์ด๋ object.keys๋ฑ์ผ๋ก ์ด๊ฑฐํ ์ ์๋ค.
// lastName ํ๋กํผํฐ๋ [[Emumerable]]์ ๊ฐ์ด false์ด๋ฏ๋ก ์ด๊ฑฐ๋์ง ์๋๋ค.
console.log(Object.keys(person)); // ["firstName"]
// [[Wirtable]]์ ๊ฐ์ด false์ธ ๊ฒฝ์ฐ
// ํด๋น ํ๋กํผํฐ๋ [[Wirtable]]์ ๊ฐ์ด false ์ด๋ฏ๋ก ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค.
// ์ด๋ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ์๋ฌ๋ ๋ฐ์ํ์ง ์๊ณ ๋ฌด์๋๋ค.
person.lastName = "Kim"
// [Configurable]]์ ๊ฐ์ด false์ธ ๊ฒฝ์ฐ ํด๋น ํ๋กํผํฐ๋ฅผ ์ญ์ ํ ์ ์๋ค.
// lastName ํ๋กํผํฐ๋ [[Configurable]]์ ๊ฐ์ด false์ด๋ฏ๋ก ์ญ์ ํ ์ ์๋ค.
// ์ด๋ ํ๋กํผํฐ๋ฅผ ์ญ์ ํ๋ฉด ์๋ฌ๋ ๋ฐ์ํ์ง ์๊ณ ๋ฌด์๋๋ค.
delete person.lastName;
// [Configurable]]์ ๊ฐ์ด false์ธ ๊ฒฝ์ฐ ํด๋น ํ๋กํผํฐ๋ฅผ ์ฌ์ ์ํ ์ ์๋ค.
// Object.defineProperty(person, 'lastName', {enumerable: true});
// Uncaught TypeError: Cannot redefine property: lastName
๐ก Object.defineProperty ๋ฉ์๋๋ก ํ๋กํผํฐ๋ฅผ ์ ์ํ ๋ ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ์ผ๋ถ ์๋ต ํ ์ ์๋ค.
- ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด์์ ์๋ต๋ ์ดํธ๋ฆฌ๋ทฐํธ๋ ๋ค์๊ณผ ๊ฐ์ด ๊ธฐ๋ณธ๊ฐ์ด ์ ์ฉ๋๋ค.
๐ก Object.defineProperty ๋ฉ์๋๋ ํ๋ฒ์ ํ๋์ ํ๋กํผํฐ๋ง ์ ์ํ ์ ์๋ค. Object.defineProperties ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ๊ฐ์ ํ๋กํผํฐ๋ฅผ ํ ๋ฒ์ ์ ์ํ ์ ์๋ค
const person = {};
Object.defineProperties(eprson, {
firstName: {
value: "Noh",
writable: true,
enumerable: true,
configurable: true,
},
lastName: {
value: "YoungWan",
writable: true,
enumerable: true,
configurable: true,
},
// ์ ๊ทผ์ ํ๋กํผํฐ ์ ์
fullName: {
// getter ํจ์
get() {
return `${this.firstName} ${this.lastName}`
},
// setter ํจ์
set(name) {
[this.firstName, this.lastName] = name.split(' ');
},
enumerable: true,
configurable: true
}
});
// set ์ดํ
person.fullName = "YoungWan Noh";
console.log(person) // {firstName: YoungWan, lastName: Noh}
๊ฐ์ฒด๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฐ์ด๋ฏ๋ก ์ฌํ ๋น ์์ด ์ง์ ๋ณ๊ฒฝ๊ฐ๋ฅ.
Object.defineProperty
๋๋Object.defineProperties
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ฌ์ ์ ํ ์๋ ์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ฐ์ฒด์ ๋ณ๊ฒฝ์ ๋ฐฉ์งํ๋ ๋ค์ํ ๋ฉ์๋๋ฅผ ์ ๊ณต, ๊ฐ์ฒด ๋ณ๊ฒฝ ๋ฐฉ์ง ๋ฉ์๋๋ค์ ๊ฐ์ฒด์ ๋ณ๊ฒฝ์ ๊ธ์งํ๋ ๊ฐ๋๊ฐ ๋ค๋ฅด๋ค.
Object.preventExtensions
๋ฉ์๋๋ ๊ฐ์ฒด์ ํ์ฅ์ ๊ธ์งํ๋ค. ๊ฐ์ฒด์ ํ์ฅ ๊ธ์ง๋ ํ๋กํผํฐ ์ถ๊ฐ ๊ธ์ง๋ฅผ ์๋ฏธํ๋ค. ์ฆ, ํ์ฅ์ด ๊ธ์ง๋ ๊ฐ์ฒด๋ ํ๋กํผํฐ ์ถ๊ฐ๊ฐ ๊ธ์ง๋๋ค.
ํ์ฅ์ด ๊ฐ๋ฅํ ๊ฐ์ฒด์ธ์ง ์ฌ๋ถ๋ Object.isExtensible ๋ฉ์๋๋ก ํ์ธํ ์ ์๋ค.
const person = { name: "noh"};
// person ๊ฐ์ฒด๋ ํ์ฅ์ด ๊ธ์ง๋ ๊ฐ์ฒด๊ฐ ์๋๋ค.
console.log(Object.isExtensible(person)); // true
// person ๊ฐ์ฒด์ ํ์ฅ์ ๊ธ์งํ์ฌ ํ๋กํผํฐ ์ถ๊ฐ๋ฅผ ๊ธ์งํ๋ค.
Object.preventExtensions(person);
// person ๊ฐ์ฒด๋ ํ์ฅ์ด ๊ธ์ง๋ ๊ฐ์ฒด๋ค.
console.log(Object.isExtensible(person)); // false
// ํ๋กํผํฐ ์ถ๊ฐ๊ฐ ๊ธ์ง๋๋ค.
person.age = 20; // ๋ฌด์. strict mode์์๋ ์๋ฌ
console.log(person); // {name: "noh"}
// ํ๋กํผํฐ ์ถ๊ฐ๋ ๊ธ์ง๋์ง๋ง ์ญ์ ๋ ๊ฐ๋ฅํ๋ค.
delete person.name;
console.log(person); // {}
// ํ๋กํผํฐ ์ ์์ ์ํ ํ๋กํผํฐ ์ถ๊ฐ๋ ๊ธ์ง๋๋ค.
Object.defineProperty(person, 'age' { value: 20 });
// TypeError : Cannot define property age, Object is not extensible
Object.seal
๋ฉ์๋๋ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ดํ๋ค. ๊ฐ์ฒด ๋ฐ๋ด์ด๋ ํ๋กํผํฐ ์ถ๊ฐ ๋ฐ ์ญ์ ์ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ ์ฌ์ ์ ๊ธ์ง๋ฅผ ์๋ฏธํ๋ค. ์ฆ, ๋ฐ๋ด๋ ๊ฐ์ฒด๋ ์ฝ๊ธฐ์ ์ฐ๊ธฐ๋ง ๊ฐ๋ฅํ๋ค.
๋ฐ๋ด๋ ๊ฐ์ฒด์ธ์ง ์ฌ๋ถ๋ Object.isSealed ๋ฉ์๋๋ก ํ์ธํ ์ ์๋ค.
const person = { name : "noh" };
// person ๊ฐ์ฒด๋ ๋ฐ๋ด(seal)๋ ๊ฐ์ฒด๊ฐ ์๋๋ค.
console.log(Object.isSealed(person)) // false
// person ๊ฐ์ฒด๋ฅผ ๋ฐ๋ด(seal)ํ์ฌ ํ๋กํผํฐ ์ถ๊ฐ, ์ญ์ , ์ฌ์ ์๋ฅผ ๊ธ์งํ๋ค.
Object.seal(person);
// person ๊ฐ์ฒด๋ ๋ฐ๋ด(seal)๋ ๊ฐ์ฒด๋ค.
console.log(Object.isSealed(person)) // true
// ๋ฐ๋ด(seal)๋ ๊ฐ์ฒด๋ configurable์ด false๋ค.
console.log(Object.getOwnPropertyDescriptors(person));
// name: { configurable: false }
// ํ๋กํผํฐ ์ถ๊ฐ๊ฐ ๊ธ์ง๋๋ค.
person.age = 20; // ๋ฌด์ strict mode์์๋ ์๋ฌ
console.log(person); // { name: "noh" }
// ํ๋กํผํฐ ์ญ์ ๊ฐ ๊ธ์ง๋๋ค.
delete person.name; // ๋ฌด์ strict mode์์๋ ์๋ฌ
console.log(person); // { name: "noh" }
// ํ๋กํผํฐ ๊ฐ ๊ฐฑ์ ์ ๊ฐ๋ฅํ๋ค.
person.name = "Noh";
console.log(person); // { name: "Noh" }
// ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ ์ฌ์ ์๊ฐ ๊ธ์ง๋๋ค.
Object.defineProperty(person, 'name', {configurable: true});
// TypeError: Cannot redefine property: name
Object.freeze
๋ฉ์๋๋ ๊ฐ์ฒด๋ฅผ ๋๊ฒฐํ๋ค. ๊ฐ์ฒด ๋๊ฒฐ์ด๋ ํ๋กํผํฐ ์ถ๊ฐ ๋ฐ ์ญ์ ์ ์ดํธ๋ฆฌ๋ทฐํธ ์ฌ์ ์ ๊ธ์ง, ํ๋กํผํฐ ๊ฐ ๊ฐฑ์ ๊ธ์ง๋ฅผ ์๋ฏธํ๋ค. ์ฆ, ๋๊ฒฐ๋ ๊ฐ์ฒด๋ ์ฝ๊ธฐ๋ง ๊ฐ๋ฅํ๋ค.
๋๊ฒฐ๋ ๊ฐ์ฒด์ธ์ง ์ฌ๋ถ๋ Object.isFronzen ๋ฉ์๋๋ก ํ์ธํ ์ ์๋ค.
const person = { name : "noh" };
// person ๊ฐ์ฒด๋ ๋๊ฒฐ(freeze)๋ ๊ฐ์ฒด๊ฐ ์๋๋ค.
console.log(Object.isFrozen(person)); // false
// person ๊ฐ์ฒด๋ฅผ ๋๊ฒฐ(freeze)ํ์ฌ ํ๋กํผํฐ ์ถ๊ฐ, ์ญ์ , ์ฌ์ ์ ์ฐ๊ธฐ๋ฅผ ๊ธ์งํ๋ค.
Object.freeze(person);
// person ๊ฐ์ฒด๋ ๋๊ฒฐ(freeze)๋ ๊ฐ์ฒด๋ค.
console.log(Object.isFrozen(person)) // true
// ๋๊ฒฐ(freeze)๋ ๊ฐ์ฒด๋ writable๊ณผ configurable์ด false๋ค.
console.log(Object.getOwnPropertyDescriptors(person));
/*
{
name: {value: "noh", writable: false, enumerable: true, configurable: false},
}
*/
// ํ๋กํผํฐ ์ถ๊ฐ๊ฐ ๊ธ์ง๋๋ค.
persona.age = 20; // ๋ฌด์. strict mode์์๋ ์๋ฌ
console.log(person); // {name: "noh"}
// ํ๋กํผํฐ ์ญ์ ๊ฐ ๊ธ์ง๋๋ค.
delete person.name; // ๋ฌด์. strict mode์์๋ ์๋ฌ
console.log(person) // {name: "noh"}
// ํ๋กํผํฐ ๊ฐ ๊ฐฑ์ ์ด ๊ธ์ง๋๋ค.
person.name = "Noh";
console.log(person) // {name: "noh"}
// ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ ์ฌ์ ์๊ฐ ๊ธ์ง๋๋ค.
Object.defineProperty(person, 'name', { configurable: true });
//TypeError: Cannot redefine property: name
์ง๊ธ๊น์ง ์ดํด๋ณธ ๋ณ๊ฒฝ ๋ฐฉ์ง ๋ฉ์๋๋ค์ ์์ ๋ณ๊ฒฝ ๋ฐฉ์ง๋ก ์ง์ ํ๋กํผํฐ๋ง ๋ณ๊ฒฝ์ด ๋ฐฉ์ง๋๊ณ ์ค์ฒฉ ๊ฐ์ฒด๊น์ง๋ ์ํฅ์ ์ฃผ์ง๋ ๋ชปํ๋ค. ๋ฐ๋ผ์
Object.freeze
๋ฉ์๋๋ก ๊ฐ์ฒด๋ฅผ ๋๊ฒฐํ์ฌ๋ ์ค์ฒฉ ๊ฐ์ฒด๊น์ง ๋๊ฒฐํ ์ ์๋ค.
๊ฐ์ฒด์ ์ค์ฒฉ ๊ฐ์ฒด๊น์ง ๋๊ฒฐํ์ฌ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ ์ฝ๊ธฐ ์ ์ฉ์ ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ๊ตฌํํ๋ ค๋ฉด ๊ฐ์ฒด๋ฅผ ๊ฐ์ ๊ฐ๋ ๋ชจ๋ ํ๋กํผํฐ์ ๋ํด ์ฌ๊ท์ ์ผ๋กObject.freeze
๋ฉ์๋๋ฅผ ํธ์ถํด์ผํ๋ค.