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