一. 深拷贝与浅拷贝与原型拷贝
浅拷贝:指向同一个内存地址
深拷贝:指向不同的内存地址
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;