深克隆和浅克隆

1.如何复制对象?

function anotherFunction() { /*..*/ }
var anotherObject = {
c: true
};
var anotherArray = [];
var myObject = {
a: 2,
b: anotherObject, // 引用, 不是复本!
c: anotherArray, // 另一个引用!
d: anotherFunction
};
anotherArray.push( anotherObject, myObject );

如何准确地表示myObject的复制呢?

首先,我们应该判断它是浅复制是深复制。于浅拷,复制出的新象中a会复制旧对象中a,也就是2,但是新象中bcd三个属性其只是三个引用,它和旧象中bcd引用的象是一的 
没有很好的解决方案:

1.JSON安全(也就是可以被序列化一个JSON字符串并且可以根据个字符串解析出一个结完全一象)的象来,有一种巧妙的复制方法: 

var newObj = JSON.parse( JSON.stringify( someObj ) );

 2.相比深复制,浅复制非常易并且问题要少得多,所以ES6Object.assign(..)方法来实现浅复制。Object.assign(..)方法的第一个参数是目标对象,之后可以跟一个或多个源象。它会遍历一个或多个源象的所有可枚的自有很快会并把它复制(使用=操作符赋值)到目标对象,最后返回目标对象 。

var newObj = Object.assign( {}, myObject );
newObj.a; // 2
newObj.b === anotherObject; // true
newObj.c === anotherArray; // true
newObj.d === anotherFunction; // true

2.属性的描述符

1.getOwnPropertyDescriptor

var myObject = {
a:2
};
Object.getOwnPropertyDescriptor( myObject, "a" );
// {
// value: 2,
// writable: true,
// enumerable: true,
// configurable: true
// }

三个特性:writable(可写)、enumerable(可枚)和configurable(可配置) 

2.defineProperty

var myObject = {};
Object.defineProperty( myObject, "a", {
value: 2,
writable: true,
configurable: true,
enumerable: true
} );
myObject.a; // 2
posted @ 2017-10-25 17:29  im.lhc  阅读(165)  评论(0编辑  收藏  举报