实现:
function copy(obj) {
if (obj.constructor === Array) {
return obj.slice(0);
}
var names = Object.getOwnPropertyNames(obj);
var descriptor = {};
var result = {};
names.forEach(function (val) {
if (getType(obj[val]) === 'Object'|| getType(obj[val]) === 'Array') {
descriptor = Object.getOwnPropertyDescriptor(obj, val);
Object.defineProperty(result,val,descriptor);
result[val] = copy(obj[val]);
} else {
descriptor = Object.getOwnPropertyDescriptor(obj, val);
Object.defineProperty(result, val, descriptor);
}
});
return result;
}
function getType(o){
return Object.prototype.toString.call(o).slice(8, -1);
}
测试:
var o = {a: 1, b: 2, c:[1,6]};
Object.defineProperty(o, 'dd', {
value: [2,3],
enumerable: false,
writable:true
});
var cr = copy(o);
for (var val of Object.getOwnPropertyNames(cr)) {
console.log(val, Object.getOwnPropertyDescriptor(cr, val));
}
输出:
a { value: 1, writable: true, enumerable: true, configurable: true }
b { value: 2, writable: true, enumerable: true, configurable: true }
c { value: [ 1, 6 ],
writable: true,
enumerable: true,
configurable: true }
dd { value: [ 2, 3 ],
writable: true,
enumerable: false,
configurable: false }