前端提高篇(二十五)JS进阶19对象特性及克隆

运行结果:报错,说明不可设置特性

在这里插入图片描述

去掉设置特性的代码,来尝试是否可以添加属性和修改属性值

在这里插入图片描述

Object.freeze(obj);//不可添加属性,不可设置特性,不可修改属性值

Object.freeze(obj);//不可添加属性,不可设置特性,不可修改属性值

Object.defineProperty(obj, ‘x’,{

writable:false,

enumerable:true,

configurable:true,

})

运行结果:报错,说明不能设置特性

在这里插入图片描述

去掉设置特性的代码,来尝试是否可以添加属性和修改属性值

在这里插入图片描述

查看特性的方法:

1.Object.isExtensible(obj)

2.Object.isSealed(obj)

3.Object.isFrozen(obj)

克隆对象


浅克隆

之前的文章已经有提过,如果用等号赋值复杂对象,obj1 = obj;复制的这是对象的地址,当obj改变时,obj1也改变;当时是使用for … in遍历的方法来拷贝

var obj = {x:1, y:2};

// 浅克隆

var obj1 = {};

for (var i in obj){

obj1[i] = obj[i];

}

但这种方法依然不能应对 属性值是是复杂对象的情况,所以还是属于浅克隆,浅拷贝

var obj = {x:1, y:{x:2}};

// 浅克隆

var obj1 = {};

for (var i in obj){

obj1[i] = obj[i];

}

运行效果:

在这里插入图片描述

深克隆:

我们可以利用递归,写一个函数解决这个问题:

var obj = {x:1, y:{x:2}};

//深克隆

function myClone(obj){

var obj1 = {};

for (var i in obj){

if (typeof(obj[i]) == ‘object’){

obj1[i] = myClone(obj[i]);

}

else{

obj1[i] = obj[i];

}

}

return obj1;

}

运行结果:

在这里插入图片描述

这个递归函数的书写思路:

1.先想最简单的,从外部看向里面的功能,就是传入一个obj,返回一个复制的obj1;即var obj1 = {}; return obj1;

2.然后是写遍历,遍历没有复杂属性值的部分,即for(var i in obj){obj1[i] = obj[i];}

3.最后写,如果遇到复杂的属性值,就调用这个函数,传入的是obj的一个属性,返回复制的属性,即obj1[i] = myClone(obj[i]);

原型克隆

原型对象修改了,继承该原型的对象如果需要使用原型对象上的某属性,得到的值就会是更新的值,

并且,如果我通过当前对象修改原型上的深层属性(当前对象没有该属性,原型对象上有),被当作原型对象的值会直接发生改变

就像这样,myClone1返回的值是以obj为原型的空对象

var obj = {x:1, y:{x:2}};

//原型克隆

function myClone1(obj){

function Temp(){}

Temp.prototype = obj;

return new Temp();

}

如果修改了obj2.y.x,obj也会被改变,因为obj2本没有y属性,就会向它的原型找这个属性,obj2.y的值依然是一个引用类型,因此它的改变会影响obj的值

在这里插入图片描述

在这里插入图片描述

obj2是空对象:

在这里插入图片描述

我就去试了一开始讲原型的案例:我之前写的那篇

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值