Object的create、assign、getPrototypeOf与拷贝
一. 深拷贝与浅拷贝与原型拷贝
浅拷贝:指向同一个内存地址
深拷贝:指向不同的内存地址
1.0 浅拷贝
function clone(obj) { return Object.assign({}, obj); } let obj2 = obj1;
1.1 深拷贝
1.1.1 JSON化
let bar = JSON.parse(JSON.stringify(foo));
1.1.2 递归函数
function deepClone(obj) { let newObj = obj.constructor === Array ? [] : {} for (let key in obj) { newObj[key] = typeOf obj[key] === 'object' ? deepClone(obj[key]) : obj[key] } return newObj }
1.2 原型拷贝
<script> /* 创建包含原型链的实验对象obj1-- start */ function inheritPrototype(subType, superType) { var prototype = Object(superType.prototype); prototype.constructor = subType; subType.prototype = prototype; } function SuperType(name) { this.name = name; this.colors = ['red', 'yellow', 'black']; } SuperType.prototype.sayName = function() { alert(this.name); } function SubType(name, age) { SuperType.call(this, name); this.age = age; } inheritPrototype(SubType, SuperType); SubType.prototype.sagAge = function() { alert(this.age); }; var obj1 = new SubType('puppy', 12); /* 完成实验对象obj1的创建 --end */ /* 原型拷贝-- start */ var obj2 = Object.getPrototypeOf(obj1); var obj3 = Object.assign(Object.create(obj2), obj1); /* 原型拷贝-- end */ console.log(obj1); console.log(obj2); console.log(obj3); </script>
function protoClone(obj) = { let protoObject = Object.getPrototypepf(obj); let newObj = Objet.assign(Object.create(protoObject), obj) }
-
let protoObject = Object.getPrototypepf(obj);获得了obj的原型对象
-
Object.create(protoObject)创建了以原型对像为原型的对象
-
Objet.assign(Object.create(protoObject), obj)将obj的属性传递给newObj
二. Object.assign() create() defineProperty()
2.0 Object.getPrototypeOf(obj)
返回obj的原型对象
2.1 Object.create(protoType, propertiesObject)
第一个参数是新对象的原型对象
第二个参数是属性描述对象,属性key就是对象的key,属性的value的对象的value属性
2.2 Object.assign(targetObject, sourceObject)
assign实现的是伪深拷贝,对于普通的属性会深拷贝,但是对于对象中前套的对象就变成了普通的浅拷贝。
1. 拷贝可枚举的属性
2. 拷贝自由自有的属性,即原型属性不会继承
let foo = { a: 1, b: 2, c: { d: 1 } } let bar = Object.assign({}, foo} foo.a++; //foo.a === 2 bar.a ===1 foo.c.d++; //bar.c.d === 2;
参考资料:https://www.cnblogs.com/hity-tt/p/6797663.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!