深克隆和浅克隆

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

转载于:https://www.cnblogs.com/linwx/articles/7730095.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值