目录可变数据不可变数据(Immutable Data)优点实现一:独立方法实现二:自定义对象实现三:函数 + 复制实现四:Proxy代理实现五:第三方不可变对象可变数据 对象被赋值
function updateData(obj, key, value) {
return {
...obj,
[key]: value
};
}
const obj = {
name: "云牧"
};
const newObj = updateData(obj, "name", "黛玉");
console.log(newObj); // { name: '黛玉' }
console.log(obj); // { name: '云牧' }
immutable-js
,就是这个思路,定义了List
、 Stack
、 Map
、OrderedMap
、Set
、OrderedSet
和 Record
这么多对象class MyObject {
constructor(obj = {}) {
this.obj = { ...obj };
}
get(name) {
return this.obj[name];
}
set(name, value) {
return new MyObject({
...this.obj,
[name]: value
});
}
}
const obj = new MyObject({
name: "云牧"
});
const newObj = obj.set("name", "黛玉");
console.log(newObj); // MyObject { obj: { name: '黛玉' } }
console.log(obj); // MyObject { obj: { name: '云牧' } }
function produce(obj, recipe) {
const newObj = { ...obj };
recipe(newObj);
return newObj;
}
const obj = {
name: "云牧"
};
const newObj = produce(obj, draft => {
draft.name = "黛玉";
});
console.log(newObj); // { name: '黛玉' }
console.log(obj); // { name: '云牧' }
function produce(obj, recipe) {
const state = {
base: obj, // 基础对象
copy: {}, // 被更改后的对象
draft: {}, // 代理对象
currenTKEy: 0 // 当前操作的key
};
const handlerItem = {
get(target, property, receiver) {
// 如果更改后的对象存在则使用copy
if (state.copy[state.currentKey]) {
return state.copy[state.currentKey][property];
}
return state.base[state.currentKey][property];
},
set(target, property, value, receiver) {
Reflect.set(state.copy[state.currentKey], property, value);
}
};
const handler = {
get(target, property, receiver) {
state.currentKey = property;
if (!state.draft[property]) {
const val = { ...state.base[property] };
const proxy = new Proxy(val, handlerItem);
state.draft[property] = proxy;
state.copy[property] = val;
}
return state.draft[property];
},
set(target, property, value, receiver) {
return Reflect.set(state.copy, property, value);
}
};
const proxyObj = new Proxy(obj, handler);
recipe(proxyObj);
return proxyObj;
}
const arrObj = Array.from({ length: 100 }, (v, index) => ({ name: "云牧" + index }));
const newObj = produce(arrObj, draft => {
draft[50].name = "黛玉";
});
console.log(newObj[50].name); // 黛玉
console.log(arrObj[50].name); // 云牧50
Immutable.js
和 immerjs
Immutable.js
需要学习他的数据格式操作,且其不可变数据需要 toJS
才能得到原生对象,心智负担大immerjs
则没有这方面的问题,且体积更为小巧以上就是Proxy的不可变数据优点及使用详解的详细内容,更多关于Proxy不可变数据的资料请关注编程网其它相关文章!
--结束END--
本文标题: Proxy的不可变数据优点及使用详解
本文链接: https://www.lsjlt.com/news/198164.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-01-12
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0