66651
๐Ÿ‘€
66651
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (57)
    • note (28)
    • log (13)
    • error (9)
    • etc (7)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
66651

๐Ÿ‘€

note

[Deep Dive] 16์žฅ ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ

16์žฅ ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ

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

์ด์ค‘ ๋Œ€๊ด„ํ˜ธ([[...]])๋กœ ๊ฐ์‹ผ ์ด๋ฆ„๋“ค์ด ๋‚ด๋ถ€ ์Šฌ๋กฏ๊ณผ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋‹ค.

๋‚ด๋ถ€ ์Šฌ๋กฏ๊ณผ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋Š” ECMAScript ์‚ฌ์–‘์— ์ •์˜๋œ ๋Œ€๋กœ ๊ตฌํ˜„๋˜์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์—์„œ ์‹ค์ œ๋กœ ๋™์ž‘ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์™ธ๋ถ€๋กœ ๊ณต๊ฐœ๋œ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋Š” ์•„๋‹ˆ๋‹ค.

const o = {};

// ๋‚ด๋ถ€ ์Šฌ๋กฏ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์˜ ๋‚ด๋ถ€ ๋กœ์ง์ด๋ฏ€๋กœ ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.
o.[[Prototype]] // Uncaught StyntaxError: Unexpected token '['

// ์ผ๋ถ€ ๋‚ด๋ถ€ ์Šฌ๋กฏ๊ณผ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ์— ํ•œํ•˜์—ฌ ๊ฐ„์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋‹จ์„ ์ œ๊ณตํ•˜๊ธฐ๋Š” ํ•œ๋‹ค.
o.__proto__ // Object.prototype
์ž‘์„ฑ์ผ ๊ธฐ์ค€ Object.prototype.__proto__ ๋Š” Deprecated ๋˜์—ˆ๋‹ค.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto

 

 

 

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

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

ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ๊ด€๋ฆฌํ•˜๋Š” ๋‚ด๋ถ€ ์ƒํƒœ ๊ฐ’์ธ ๋‚ด๋ถ€ ์Šฌ๋กฏ [[Value]], [[Writable]], [[Enumerable]], [[Configurable]]์ด๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์ง€๋งŒ [ic]Object.getOwnPropertyDescriptor[/ic], [ic]Object.getOwnPropertyDescriptors[/ic] ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„์ ‘์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜๋Š” ์žˆ๋‹ค.

const person = {
  name: 'Lee',
};

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

person.age = 10;

console.log(Object.getOwnPropertyDescriptors(person));
// {
//    name: {value: 'Lee', writable: true, enumerable: true, configurable: true},
//    age: {value: 10, writable: true, enumerable: true, configurable: true},
// }

 

 

 

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

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

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

ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ƒ์„ฑ ๋  ๋•Œ [[Value]] ์˜ ๊ฐ’์€ ํ”„๋กœํผํ‹ฐ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜๋ฉฐ [[Writable]], [[Enumerable]], [[Configurable]] ์˜ ๊ฐ’์€ true๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค.

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

 

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

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

ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ์„ค๋ช…
[[Get]] get - ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ์ฝ์„ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์ ‘๊ทผ์ž ํ•จ์ˆ˜
- ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ ํ‚ค๋กœ ํ”„๋กœํผํ‹ฐ ๊ฐ’์— ์ ‘๊ทผํ•˜๋ฉด ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ [[Get]]์˜ ๊ฐ’์ธ getter ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ํ”„๋กœํผํ‹ฐ ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜
[[Set]] set - ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ์ €์žฅํ•  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์ ‘๊ทผ์ž ํ•จ์ˆ˜
- ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ ํ‚ค๋กœ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ์ €์žฅํ•˜๋ฉด ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ [[Set]]์˜ ๊ฐ’์ธ setter ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ํ”„๋กœํผํ‹ฐ ๊ฐ’์œผ๋กœ ์ €์žฅ
[[Enumerable]] enumerable ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์˜ [[Enumerable]]๊ณผ ๊ฐ™์Œ
[[Configurable]] configurable ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์˜ [[Configurable]]๊ณผ ๊ฐ™์Œ
const person = {
    // ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ
    firstName: 'Rose',
    lastName: 'Park',

    // getter ํ•จ์ˆ˜
    get fullName() {
        return `${this.firstName} ${this.lastName}`;
    },

    // setter ํ•จ์ˆ˜
    set fullName(name) {
        [this.firstName, this.lastName] = name.split(' ');
    },
};

// ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•œ ํ”„๋กœํผํ‹ฐ ๊ฐ’์˜ ์ฐธ์กฐ
console.log(person.firstName);
// Rose

// ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•œ ํ”„๋กœํผํ‹ฐ ๊ฐ’์˜ ์ฐธ์กฐ
console.log(person.fullName);
// Rose Park

// ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•œ ํ”„๋กœํผํ‹ฐ ๊ฐ’์˜ ์ €์žฅ
person.fullName = 'Jennie Kim';
console.log(person);
// {firstName: 'Kim', lastName: 'Jennie', fullName: [Getter/Setter]}

// firstName์€ ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ
console.log(Object.getOwnPropertyDescriptor(person, 'firstName'));
// {value: 'rose', writable: true, enumerable: true, configurable: true}

// firstName์€ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ
console.log(Object.getOwnPropertyDescriptor(person, 'fullName'));
// {get: f, set: f, enumerable: true, configurable: true};

 

 

 

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

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

const person1 = {};

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

// ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ˆ„๋ฝ์‹œํ‚ค๋ฉด undefined, false ๊ฐ€ ๊ธฐ๋ณธ๊ฐ’
console.log(Object.getOwnPropertyDescriptor(person1, 'firstName'));
// {value: 'Rose', writable: true, enumerable: true, configurable: true};

// ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ ์ •์˜
Object.defineProperty(person1, 'changeName', {
    get() {
        return `${this.firstName}`;
    },

    set(name) {
        // [[Writable]]์˜ ๊ฐ’์ด true ์ด๋ฏ€๋กœ [[Value]]์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ
        this.firstName = name;
    },

    enumerable: true,
    configurable: true,
});

person1.changeName = 'Jennie';
console.log(person1);
// {firstName: 'Jennie', changeName: [Getter/Setter]}

const person2 = {};

// Object.defineProperties ๋ฉ”์„œ๋“œ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ํ•œ ๋ฒˆ์— ์ •์˜ ๊ฐ€๋Šฅ
Object.defineProperties(person2, {
    firstName: {
        value: 'Jennie',
        writable: true,
        enumerable: true,
        configurable: true,
    },
    lastName: {
        value: 'Lee',
        writable: true,
        enumerable: true,
        configurable: true,
    },
    fullName: {
        get() {
            return `${this.firstName} ${this.lastName}`;
        },

        set(name) {
            [this.firstName, this.lastName] = name.split(' ');
        },

        enumerable: true,
        configurable: true,
    },
});

person2.fullName = 'La lisa';
console.log(person2);
// {firstName: 'La', lastName: 'lisa', fullName: [Getter/Setter]}

 

 

 

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

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

 

๊ฐ์ฒด ํ™•์žฅ ๊ธˆ์ง€

[ic]Object.preventExtensions[/ic] ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด์˜ ํ™•์žฅ์„ ๊ธˆ์ง€ํ•œ๋‹ค. ํ™•์žฅ์ด ๊ธˆ์ง€๋œ ๊ฐ์ฒด๋Š” ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€๊ฐ€ ๊ธˆ์ง€๋œ๋‹ค.

ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด์ธ์ง€ ์—ฌ๋ถ€๋Š” [ic]Object.isExtensible[/ic] ๋ฉ”์„œ๋“œ๋กœ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๊ฐ์ฒด ๋ฐ€๋ด‰

[ic]Object.seal[/ic] ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ€๋ด‰ํ•œ๋‹ค. ๋ฐ€๋ด‰๋œ ๊ฐ์ฒด๋Š” ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ(๊ฐฑ์‹ )๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋ฐ€๋ด‰๋œ ๊ฐ์ฒด์ธ์ง€ ์—ฌ๋ถ€๋Š” [ic]Object.isSealed[/ic] ๋ฉ”์„œ๋“œ๋กœ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๊ฐ์ฒด ๋™๊ฒฐ

[ic]Object.freeze[/ic] ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด๋ฅผ ๋™๊ฒฐํ•œ๋‹ค. ๋™๊ฒฐ๋œ ๊ฐ์ฒด๋Š” ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋™๊ฒฐ๋œ ๊ฐ์ฒด์ธ์ง€ ์—ฌ๋ถ€๋Š” [ic]Object.isFrozen[/ic] ๋ฉ”์„œ๋“œ๋กœ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๋ถˆ๋ณ€ ๊ฐ์ฒด

๊ฐ์ฒด์˜ ์ค‘์ฒฉ ๊ฐ์ฒด๊นŒ์ง€ ๋™๊ฒฐํ•˜์—ฌ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์ฝ๊ธฐ ์ „์šฉ์˜ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ๊ฐ์ฒด๋ฅผ ๊ฐ’์œผ๋กœ ๊ฐ–๋Š” ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•ด ์žฌ๊ท€์ ์œผ๋กœ [ic]Object.freeze[/ic] ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.

function deepFreeze(target) {
    if (target && typeof target === 'object' && !Object.isFrozen(target)) {
        Object.freeze(target);
        Object.keys(target).forEach(key => deepFreeze(target[key]));
    }
    return target;
}
์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)
    'note' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [Deep Dive] 42์žฅ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
    • [Deep Dive] 22์žฅ this
    • [JavaScript] ์‰ผํ‘œ ์—ฐ์‚ฐ์ž (Comma Operator)
    • [Deep Dive] 14-15์žฅ
    66651
    66651
    always awake

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”