1 回答
TA贡献1815条经验 获得超13个赞
如果没有必要的话,直接 JSON.parse(JSON.stringify(obj)) 最好了,下面的代码,应该是深克隆,包括数据,访问器,和Symbol 属性,来源 MDN
var obj = {
foo: 1,
get bar() {
return 2;
}
};
// 下面这个函数会拷贝所有自有属性的属性描述符
function completeAssign(target, ...sources) {
sources.forEach(source => {
let descriptors = Object.keys(source).reduce((descriptors, key) => {
descriptors[key] = Object.getOwnPropertyDescriptor(source, key);
return descriptors;
}, {});
// Object.assign 默认也会拷贝可枚举的Symbols
Object.getOwnPropertySymbols(source).forEach(sym => {
let descriptor = Object.getOwnPropertyDescriptor(source, sym);
if (descriptor.enumerable) {
descriptors[sym] = descriptor;
}
});
Object.defineProperties(target, descriptors);
});
return target;
}
var copy = completeAssign({}, obj);
console.log(copy);
// { foo:1, get bar() { return 2 } }
添加回答
举报