如何解决如何在不更改原始对象的情况下创建对象的深度冻结版本?
假设我们有以下对象:
"use strict"; // To trigger errors on frozen objects mutation attempts
const myObj = {
rootProp1: {
leafProp1: "hello",leafProp2: "world",rootProp2: "!",};
使用“经典” Object.freeze
方法时,我们仅冻结对象的根属性:
const frozen = Object.freeze(myObj);
frozen.rootProp2 = "?"; // error --> OK
delete frozen.rootProp1; // error --> OK
frozen.extraRootProp = "how are you?"; // error --> OK
frozen.rootProp1.leafProp1 = "hi"; // NO ERROR --> I don't want this
为了深深冻结对象,我们可以使用类似this one的方法:
const deepFrozen = deepFreeze(myObj);
deepFrozen.rootProp1.leafProp1 = "hi"; // error --> OK
myObj.rootProp2 = "?"; // ERROR --> I don't want this
但这对我来说仍然是一个问题:我想要一个可以返回对象的冻结版本的函数,而不冻结原始对象(我正在尝试学习函数式编程,所以我想尽可能少的突变)。该怎么做?
解决方法
在ECMAScript 2018(ES9)中,借助spread operator,可以使用以下简单功能:
const deepFreeze = (obj) => typeof obj === "object"
? Object.freeze({
...Object.entries(obj).reduce(
(prev,[key,value]) => ({
...prev,[key]: value ? deepFreeze(value) : value,}),{}
),})
: typeof obj === "function" ? Object.freeze(obj) : obj;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。