UNPKG

fzo

Version:

fzo is simply freeze object library

179 lines (129 loc) 3.45 kB
# fzo ## motivation ```js const num = 42; num = 72; // error! ok const str = 'string'; str = 'str'; // error! ok const arr = [1, 2, 3, 4, 5]; arr = [4, 4, 2]; // error! ok arr[0] = 42; // arr[0] is 1? 42? console.log(arr[0]); // 42 wow... arr[72] = 72; console.log(arr[72]); // 72 console.log(arr); // 42, 2, 3, 4, 5, ...null..., 72 wow... const obj = { kugimiya: 'rie', murakawa: 'rie', takahashi: 'rie', tanaka: 'minami', }; // hmmm... obj.tanaka = 'rie'; // obj.tanaka is "manami"? "rie?" console.log(obj.tanaka); // "rie" wow... obj.kanda = 'rie'; console.log(obj.kanda); // "rie" // const is not readonly? :< ``` I have come to realize a strange truth. But we can freeze Objects and Arrays using Object.freeze() ```js const arr = [1, 2, 3, 4, 5]; Object.freeze(arr); arr[0] = 42; arr[72] = 74; console.log(arr); // [1, 2, 3, 4, 5] nice :) const obj = { kugimiya: 'rie', murakawa: 'rie', takahashi: 'rie', tanaka: 'minami', }; Object.freeze(obj); obj.kanda = 'rie'; console.log(obj); // { kugimiya:"rie", murakawa:"rie", takahashi:"rie", tanaka:"minami" } nice :) // is perfect? const formation = [ [4, 4, 2], [3, 4, 3], [3, 5, 2], [5, 5, 0], { classic: { wm: '3-2-2-3', }, }, ]; Object.freeze(formation); formation[0] = [4, 5, 1]; console.log(formation[0]); // [4, 4, 2] nice :? formation[3512] = [3, 5, 1, 2]; console.log(formation); // immutable :) formation[0][1] = 5; formation[0][2] = 1; console.log(formation[0]); // [4, 5, 1] wow... formation[4].modern = { Lavolpiana: '3-2-2-3' }; console.log(formation[4]); // { classic: { "wm": "3-2-2-3" }, modern: { "Lavolpiana": "3-2-2-3" }} wow... const voiceActor = { minami: 'tanaka', rie: { kugimiya: 'rie', murakawa: 'rie', takahashi: 'rie', tanaka: 'rie', }, }; Object.freeze(voiceActor); voiceActor.minami = 'tsuda'; console.log(voiceActor.minami); // "tanaka" nice :? voiceActor.rie.tanaka = 'minami'; console.log(voiceActor.rie.tanaka); // "minami" is not "rie" wow... :< ``` And there is something strange about DeepClone, the popular and easy way to do it. ```js const arr = [1, 2, 3, 4, 5]; const newArr = [...arr]; arr.push(42); console.log(arr); // [1, 2, 3, 4, 5, 42] conosle.log(newArr); // [1, 2, 3, 4, 5] // ok :) ``` ```js const arr = [[1, 2, 3, 4], 5, 6, 7, 8, 9]; const newArr = [...arr]; arr[0].push(42); console.log(arr); // [[1, 2, 3, 4, 42], 5, 6, 7, 8, 9] console.log(newArr); // [[1, 2, 3, 4, 42], 5, 6, 7, 8, 9] wow... :< ``` We all like "pure," but the truth, world is not pure. But we must aspire to the maximum of purity. So, let's go on a journey for "pure". ## Installation ### browser ```html <script src="https://cdn.jsdelivr.net/npm/fzo@latest"></script> ``` ### npm & node.js ```bash npm i fzo ``` ```js const arr = [1, 2, 3, [4, 5, 6, 7]]; const _ = require('fzo'); const frozenArr = _.fzo(arr); const deepCloneArr = _.deepClone(arr); const frozenDeepCloneArr = _.fzo(_.deepClone(arr)); ``` ```js const arr = [1, 2, 3, [4, 5, 6, 7]]; const { fzo, deepClone } = require('fzo'); const frozenArr = fzo(arr); const deepCloneArr = deepClone(arr); const frozenDeepCloneArr = fzo(deepClone(arr)); ``` ## License [Apache 2.0](https://github.com/rewrite0w0/fzo/blob/main/LICENSE)