diff --git a/snippets/deepFreeze.md b/snippets/deepFreeze.md new file mode 100644 index 000000000..4d6e40728 --- /dev/null +++ b/snippets/deepFreeze.md @@ -0,0 +1,24 @@ +### deepFreeze + +Deep freezes an object. + +Calls `Object.freeze(obj)` recursively on all unfrozen properties of passed object that are `instanceof` object. + +```js +const deepFreeze = obj => + Object.keys(obj).forEach( + prop => + !obj[prop] instanceof Object || Object.isFrozen(obj[prop]) + ? null + : deepFreeze(obj[prop]) + ) || Object.freeze(obj); +``` + +```js +'use strict'; + +const o = deepFreeze([1, [2, 3]]); + +o[0] = 3; // not allowed +o[1][0] = 4; // not allowed as well +``` diff --git a/tag_database b/tag_database index 25701b373..ee176151d 100644 --- a/tag_database +++ b/tag_database @@ -48,6 +48,7 @@ debounce:function decapitalize:string,array deepClone:object,recursion deepFlatten:array,recursion +deepFreeze:object,recursion defaults:object defer:function degreesToRads:math diff --git a/test/deepFreeze/deepFreeze.js b/test/deepFreeze/deepFreeze.js new file mode 100644 index 000000000..29ab57e7e --- /dev/null +++ b/test/deepFreeze/deepFreeze.js @@ -0,0 +1,17 @@ +const deepFreeze = obj => { + Object.freeze(obj); + + Object.getOwnPropertyNames(obj).forEach(function(prop) { + if ( + obj.hasOwnProperty(prop) && + obj[prop] !== null && + (typeof obj[prop] === 'object' || typeof obj[prop] === 'function') && + !Object.isFrozen(obj[prop]) + ) { + deepFreeze(obj[prop]); + } + }); + + return obj; +}; +module.exports = deepFreeze; diff --git a/test/deepFreeze/deepFreeze.test.js b/test/deepFreeze/deepFreeze.test.js new file mode 100644 index 000000000..ca1166920 --- /dev/null +++ b/test/deepFreeze/deepFreeze.test.js @@ -0,0 +1,6 @@ +const expect = require('expect'); +const deepFreeze = require('./deepFreeze.js'); + +test('deepFreeze is a Function', () => { + expect(deepFreeze).toBeInstanceOf(Function); +});