大涛子客栈

用 forEach 来复制一个对象的副本

用 forEach 来复制一个对象的副本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 对象复制函数
function copy(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 copyObj1 = {
a: 1,
b: 2
};
var copyObj2 = copy(copyObj1);
console.log(copyObj2); // { a: 1, b: 2 }
console.log(copyObj2 === copyObj1); // false

Object.create

Object.create(proto[, propertiesObject])方法创建一个新对象,使用现有的对象来提供新创建的对象的proto

Object.getPrototypeOf

Object.getOwnPropertyNames

Object.getOwnPropertyDescriptor

Object.defineProperty

总结

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function copy(obj) {
// Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__
// Object.getPrototypeOf(object)方法返回指定对象的原型(内部[[Prototype]]属性的值
var copy = Object.create(Object.getPrototypeOf(obj));
// Object.getOwnPropertyNames(obj)方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组
var propNames = Object.getOwnPropertyNames(obj);

propNames.forEach(function(name) {
// Object.getOwnPropertyDescriptor(obj, prop)方法返回指定对象上一个自有属性对应的属性描述符。
// (自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性)
var desc = Object.getOwnPropertyDescriptor(obj, name);
// Object.defineProperty(obj, prop, descriptor)方法会直接在一个对象上定义一个新属性,
// 或者修改一个对象的现有属性, 并返回这个对象
Object.defineProperty(copy, name, desc);
});

return copy;
}

资料

 评论