js深浅拷贝, 讨论在函数返回obj时是否需要解决浅拷贝问题
结论 需要
- js函数是浅拷贝确定无疑, 没想到 经过函数返回的数据也是浅拷贝.
- 所以想像其他语言那样 provice 变量 有点困难, 需要先解除浅拷贝后返回, 否则变量污染依然存在
// js obj浅拷贝测试
var person = new Object();
person.name = 'abc';
person.obj = new Object({
name: 'bcd'
});
person.fun = function() {
// test 1
// return this.name;
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// test 2
return this.obj;
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
}
// test 1
// console.log('person.name', person.name);
// var name = person.fun();
// console.log('name', name);
// name = '222';
// console.log('name', name);
// console.log('person.name', person.name);
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// test 2
console.log('person.obj', person.obj);
var name = person.fun();
console.log('name', name);
name.name = '222';
console.log('name', name);
console.log('person.obj', person.obj);
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
以上问题讨论的浅拷贝导致的 可以用原生方案解决(目前没实测)
js高级程序设计=>第六章 面向对象=>6.1.1 属性类型 中有提到
js 中对象的属性分为 数据属性, 访问器属性(表示细节没看懂, 不过大概了解了)
Configurable(是否可通过 delete 删除属性而重新定义属性 默认: true)
Enumerable(是否可被 for-in 所循环 默认: true)
Writable(是否可以直接修改值 默认: true)
Value(看个大概, 没啥用, 就是数据操作函数罢了, 不需要懂)
// 大概这么写, 知道就好, 并无多大卵用. 只是可以解决 该文件提到的问题而已
// ** 问题 改函数属性可否 被其 子对象所继承 并无尝试, 等到用的时候再说吧
Object.defineProperty(<Object>, <key>, {
configurable: false,
})
继续上一个 可以用原生解决 赋值校验问题了
Object.defineProperty(<Object>, <key>, {
get: function(key) {
// 解决 浅拷贝问题
if (this[key]) {
let res = JSON.parse(JSON.stringify(this[key]))
return res;
}
else {
return undefined;
}
},
set: function(newValue) {
// 不管 就是数据类型 匹配 父类设置的属性 然后判断可不可以赋值
}
})
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?