##Q 深拷贝的实现方式
- 原生一级拷贝Object.assign
- jquery.extend
- 递归(去除ownerProperty)
- lodash.deepClone 原理分析:juejin.cn/post/684490…
- 通过 Object.create
function deepCopy(obj) {
var copy = Object.create(Object.getPrototypeOf(obj));
var propNames = Object.getOwnPropertyNames(obj);
propNames.forEach(function(name) {
var desc = Object.getOwnPropertyDescriptor(obj, name);
Object.defineProperty(copy, name, desc);
});
return copy;
}
var obj1 = { a: 1, b: {bc: 50, dc: 100, be: {bea: 1}} };
var obj2 = deepCopy(obj1);
console.log(obj2)
obj1.a = 20;
console.log(obj1)
console.log(obj2)
//Object {a: 1, b: Object}
//Object {a: 20, b: Object}
//Object {a: 1, b: Object}
分析:
Object.getPrototypeOf(obj):Object.getPrototypeOf( obj) === obj.__proto__
obj1 = { a: 1, b: {bc: 50, dc: 100, be: {bea: 1}} };
Object.getOwnPropertyNames(obj1)=>[a,b]
方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组。