Skip to content

Instantly share code, notes, and snippets.

@macchiitaka
Last active May 3, 2023 13:21
Show Gist options
  • Select an option

  • Save macchiitaka/61d990fbeb003a91050004ddd2213104 to your computer and use it in GitHub Desktop.

Select an option

Save macchiitaka/61d990fbeb003a91050004ddd2213104 to your computer and use it in GitHub Desktop.
[demo] deep freeze
/* if 'use strict' mode, TypeErrors occurs*/
/**
* freeze object deeply
*
* @param {{}} object
*/
const deepFreeze = (object) => {
Object.freeze(object);
for (const propKey in object) {
const prop = object[propKey];
const shouldContinue =
!object.hasOwnProperty(propKey) ||
typeof prop !== "object" ||
Object.isFrozen(prop);
if (shouldContinue) {
continue;
}
deepFreeze(prop);
}
};
/**
* deep freeze object
*
* @type {{obj: {deep: string}, shallow: string}}
*/
const deepFreezeObj = {
obj: {
deep: "freeze!!",
},
shallow: "freeze!!",
};
/**
* shallow freeze object
*
* @type {{obj: {deep: string}, shallow: string}}
*/
const shallowFreezeObj = {
obj: {
deep: "freeze!!",
},
shallow: "freeze!!",
};
deepFreeze(deepFreezeObj);
Object.freeze(shallowFreezeObj);
// try writing
deepFreezeObj.obj.deep = "change...";
deepFreezeObj.shallow = "change...";
shallowFreezeObj.obj.deep = "change...";
shallowFreezeObj.shallow = "change...";
// print
console.log(deepFreezeObj.obj.deep); // freeze!!
console.log(deepFreezeObj.shallow); // freeze!!
console.log(shallowFreezeObj.obj.deep); // change...
console.log(shallowFreezeObj.shallow); // freeze!!
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment