js高级(代理,浅拷贝深拷贝,节流和防抖,闭包.hasOwnProperty)

1.代理

1.问题:如何定义一个对象,不会被修改,也不能被遍历?
  1. 通过Object.defineProperty(对象,属性名,option)定义默认属性

    • 无法被修改
    • 无法被删除
    • 无法被遍历

    注意:Object.Property传入的值与返回的值是同一个地址

  2. 可以配置一下属性

    • value:初始值
    • writable:true (true允许被修改)
    • enumerable:true(rue允许被遍历)
    • configurable:true(rue允许被删除)
  3. 提供get和set2个方法

    • 注意:get和set不能和value,writable一起使用,当给对象设置属性的值,会触发set
        //    var obj={}var o = Object.defineProperty({}, "name", {value: "刘德华",//初始值writable: true,//true 允许被修改enumerable: true,//true 允许被遍历configurable: true//true 允许被删除})//    delete o.name//删除// o.name="小易"//修改// for(let k in o){//     console.log(k,o[k]);//name 刘德华// }//遍历console.log(o);//{name: '刘德华'}var person = {name: "吴彦祖",}//给一个初始值person.age = 0// 问题:直接操作Person,给Person添加属性,容易出现值的不准确// 聘请一个代理(秘书)var proxy = Object.defineProperty({}, "age", {set(val) {if (!(val >= 18 && val <= 50)) {console.log("值不合法");} else {console.log("值合法");person.age = val}},get() {return `年龄${person.age}`}})// 读写都要经过代理proxy.age = 22//设置年龄console.log(proxy.age);//读取年龄console.log(person);
2.查看方法有几个参数

使用arguments

3.hasOwnProperty
  1. 数组是特殊的对象,也就拥有对象的原型的属性和方法

  2. for…in会遍历原型上的属性和方法

    解决:

    • 使用Object.prototype.hasOwnProperty如果是原型上属性和方法,就为false,不是为true
  3. for…of 不会遍历原型上的属性和方法

    解决:

    • 使用Object.keys结合for…of
Object.prototype.address = "中国"function Person(name, age, sex) {this.name = name,this.age = age,this.sex = sex}var p = new Person("小易", 22, "女")// for..in会遍历到父的原型上的属性和方法for (let key in p) {console.log(key);//name, age, sex,address}// 解决方案1:使用Object.keys结合for..ofvar keys = Object.keys(p)for (let key of keys) {console.log(key);//name, age, sex}// 解决方案2:Object.prototype.hasOwnProperty如果是原型上属性和方法,就为false,不是为truefor (let key in p) {// 如果是原型上属性和方法,就为false,不是为trueconsole.log(key,Object.prototype.hasOwnProperty.call(p, key));if (Object.prototype.hasOwnProperty.call(p, key)) {const el = p[key]console.log(el);}}
4.浅拷贝

1.概念:除了第一层地址不共享,第二层以上的地址都共享,就是浅拷贝

2.对象的拷贝方法

  1. Object.assign()
  2. {…obj}

3.数组的浅拷贝

  1. […arr]
  2. arr.slice(0)
  3. [].concat(arr)
  4. arr.filter((item)=>item)
  5. _.clone(arr) lodash的方法
 var Person = {name: "老刘",age: 50,children: {name: "小刘",age: 20}}// 对象浅拷贝// 方法1 // var newPerson=Object.assign({},Person)// 方法二var newPerson = { ...Person }Person.name = "老老刘"Person.children.name = "小小刘"console.log(Person);console.log(newPerson);console.log(newPerson === Person);//falseconsole.log(newPerson.children === Person.children);//true// 数组浅拷贝var arr = ["00", ["11", 22], { id: 1, name: "aa" }, { id: 2, name: "bb" }]// var arr1=[...arr]// var arr1=arr.slice(0)// var arr1=[].concat(arr)var arr1 = arr.filter(function(item){return item})arr1[0] = "99"arr1[1][0] = "zzz"console.log(arr1);console.log(arr);
   // 使用lodash的clone,实现浅拷贝,数组与对象的浅拷贝var arr=[11,[22,33],44]var arr1=_.clone(arr)arr[1][0]="zzzz"arr[0]="aaa"console.log(arr);console.log(arr1);var obj={id:1,name:"刘德华",children:{id:2,name:"小小易"}}var obj1=_.clone(obj)obj.name="zzzz"obj.children.name="ffff"console.log(obj);console.log(obj1);
5.lodash的使用

1复制lodash.js

.https://www.bootcdn.cn/lodash.js/

2.打开官网,查文档

https://www.lodashjs.com/

6.深克隆

1.如何判断引用类型?

1.Object.prototype.toString.call(对象名)

​ 2.constructor.name

2.实现深克隆的方法?

  1. js提供的

    JSON.stringify和JSON.parse能够实现深克隆,但是会丢失方法

  var p=JSON.parse(JSON.stringify(person0))
  1. 自己写

        //------------自己写深克隆---------var person0 = {id: 1,name: "蔡徐坤",children: {id: 11,name: "小刘"}}console.log(p);function deep(o) {let temp;if (Object.prototype.toString.call(o).includes("Object")) {temp = {}} else if (Object.prototype.toString.call(o).includes("Array")) {temp = []}for (const key in o) {if (Object.hasOwnProperty.call(o, key)) {// console.log(o[key]);//    如果是引用数据类型,进行递归if (typeof o[key] === "object") {temp[key] = deep(o[key])// console.log(deep(o[key]));} else {// 如果是值类型,直接赋值temp[key] = (o[key])}}}return temp}var person1 = deep(person0)person0.children.name = "jj"// console.log(person0);// console.log(person1);/* 数组实现深克隆*/var arr0=[11,[22,33],44]var arr1=deep(arr0)arr0[1][0]="hhh"console.log(arr0);console.log(arr1);
    
  2. 使用lodash cloneDeep

   var person2 = {id: 1,name: "蔡徐坤",children: {id: 11,name: "小刘"}}var person3 = _.cloneDeep(person2)person2.children.name = "mmmm"console.log(person2);console.log(person3);
7.闭包

1.概念:

函数嵌套函数,内部函数可以访问外部函数的变量和参数,变量和参数不会被垃圾回收机制所回收

2.闭包的好处

  1. 减少全局变量的污染
  2. 实现缓存

3.形成闭包的3个条件

  1. 函数嵌套函数
  2. 利用作用域(局部/全局)
  3. GC(垃圾回收机制)被使用就不会回收(标记清除法,引用计数法)

4.闭包的优点

  1. 保存变量,让一个变量长期驻扎在内存中,不会被释放’
 //    对于outer来说,a是局部变量function outer() {var a=100//    对于inner来说,a是全局变量function inner(){a+10}return inner}var f=outer()console.log(f);
8.节流和防抖

降低执行频率,稀释执行次数

​ 节流 throttle

  // 节流 throttlevar box = document.querySelector(".box")box.onmousemove = throttle(function (e) {console.log(e);console.log(this);console.log(1);}, 100)// throttle页面加载执行function throttle(callback, delay = 600) {let start = Date.now()return function (e) {let end = Date.now()if (end - start >= delay) {callback.bind(this)(e)console.log(this);console.log(e);//给start重写标记开始的时间start = end}}}

​ 防抖 debounce

   var box = document.querySelector(".box")// 防抖 debouncebox.onmousemove = debounce(function (e) {console.log(e);console.log(this);console.log(1);}, 100)function debounce(callback, delay = 600) {var timer;return function (evt) {let self = thisclearTimeout(timer)timer = setTimeout(function () {console.log(this);callback.call(self, evt)// callback.call(self, evt);}, delay)}}

9.盒子拖拽.(原型链+继承+构造函数)

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.box {width: 100px;height: 100px;background-color: pink;position: absolute;}.boxRed {width: 100px;height: 100px;background-color: red;position: absolute;top: 115px;}.boxYellow {width: 100px;height: 100px;background-color: yellow;position: absolute;top: 300px;}</style>
</head><body><div class="box"></div><div class="boxRed"></div><div class="boxYellow"></div><script>// 原型拖拽function DragBox(cls) {this.el = document.querySelector(cls)}DragBox.prototype = {constructor: DragBox,dragStart() {let self = thisthis.el.onmousedown = function (e) {let disX = e.offsetXlet disY = e.offsetYself.dragIng(disX, disY)self.dragEnd()}},dragIng(x, y) {let self = thisdocument.onmousemove = function (e) {console.log(this);self.el.style.left = e.pageX - x + "px"self.el.style.top = e.pageY - y + "px"}},dragEnd() {document.onmouseup = function () {document.onmousemove = document.onmouseup = null}},}new DragBox(".box").dragStart()// 红色继承function DragBoxLimit(el) {DragBox.call(this, el)}DragBoxLimit.prototype = new DragBox;DragBoxLimit.prototype.dragIng = function (x, y) {let self = this;document.onmousemove = function (e) {let mX = e.pageX - xlet mY = e.pageY - yif (mX < 0) {mX = 0}if (mY < 0) {mY = 0}self.el.style.left = mX + "px"self.el.style.top = mY + "px"}}new DragBoxLimit(".boxRed").dragStart()// 黄色继承function DragBoxLimitText(el) {DragBox.call(this, el)}DragBoxLimitText.prototype = new DragBox;DragBoxLimitText.prototype.dragIng = function (x, y) {let self = this;document.onmousemove = function (e) {let mX = e.pageX - xlet mY = e.pageY - yif (mX < 0) {mX = 0}if (mY < 0) {mY = 0}self.el.style.left = mX + "px"self.el.style.top = mY + "px"self.el.innerHTML = "top:" + self.el.style.top + "<br>left:" + self.el.style.left}}new DragBoxLimitText(".boxYellow").dragStart()</script>
</body></html>

10.盒子拖拽(类)


<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.box {width: 100px;height: 100px;background-color: pink;position: absolute;}.boxRed {width: 100px;height: 100px;background-color: red;position: absolute;top: 115px;}.boxYellow {width: 100px;height: 100px;background-color: yellow;position: absolute;top: 300px;}</style>
</head><body><div class="box"></div><div class="boxRed"></div><div class="boxYellow"></div><script>class box {constructor(el) {this.el = document.querySelector(el)}dragStart() {let self = thisthis.el.onmousedown = function (e) {let disX = e.pageX-this.el.offsetLeftlet disY = e.offsetYself.dragIng(disX, disY)self.dragEnd()}}dragIng(x, y) {let self = thisdocument.onmousemove = function (e) {console.log(this);self.el.style.left = e.pageX - x + "px"self.el.style.top = e.pageY - y + "px"}}dragEnd() {document.onmouseup = function () {document.onmousemove = document.onmouseup = null}}}class yellowBox extends box {constructor(el) {super(el)// this.left=e.pageX-e.offsetX}dragIng(x, y) {let self = thisdocument.onmousemove = function (e) {console.log(this);self.el.style.left = e.pageX - x + "px"self.el.innerHTML = "left:" + self.el.style.leftself.el.style.top = e.pageY - y + "px"self.el.innerHTML = "top:" + self.el.style.top + "<br>left:" + self.el.style.leftconsole.log( self.el.style.left);}}}class RedBox extends box {constructor(el) {super(el)// this.left=e.pageX-e.offsetX}dragIng(x, y) {let self = thisdocument.onmousemove = function (e) {console.log(this);let mX = e.pageX - xlet mY = e.pageY - yif (mX < 0) {mX = 0}if (mY < 0) {mY = 0}self.el.style.left = mX + "px"self.el.style.top = mY + "px"}}}var b = new yellowBox(".boxYellow")var p = new box(".box")var r=new RedBox(".boxRed")r.dragStart()b.dragStart()p.dragStart()</script>
</body></html>

11.tab栏切换

在这里插入图片描述

 var Main = document.querySelectorAll(".main")for (var i = 0; i < TabItem.length; i++) {TabItem[i].onclick = change(i)//change会被执行4次// console.log(TabItem[i].onclick);}function change(n) {return function (e) {for (var i = 0; i < TabItem.length; i++) {TabItem[i].className = "tab-item"// 下面的图片Main[i].className = "main"}// e.target.className="tab-item active"this.className = "tab-item active"console.log(this);// 下面的图片Main[n].className = "main selected"}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/152740.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MM-Camera架构-Preview 流程分析

目录 文章目录 1 log开的好&#xff0c;问题都能搞2 lib3 preview3.1 打开视频流3.1.1 cpp\_module\_start\_session3.1.2 cpp\_thread\_create3.1.3 cpp\_thread\_funcsundp-3.1 cpp\_hardware\_open\_subdev(ctrl->cpphw)sundp-3.2 cpp\_hardware\_process\_command(ctrl-…

JIRA 如何在项目之间移动 Issue

需要使用 JIRA 的查找功能。 把需要移动的 Issue 先全部找到&#xff0c;然后选择 Tools 下面的所有 Issues 批量操作页面 在随后的页面中&#xff0c;将会出现批量操作的页面。 在这里&#xff0c;可以对需要进行批量操作的问题&#xff0c;进行全部选择。 然后单击下一步继…

RunnerGo亮相QECon大会上海站,来看看这款全栈测试平台

QECon&#xff08;Quality Efficiency Conference&#xff09;质量效能大会在上海正式开幕&#xff01;本次大会以"数生智慧&#xff1a;高质量发展新引擎"为主题&#xff0c;深入探讨如何借助数字化和智能化技术推动软件质量的发展&#xff0c;为高质量经济发展提供…

分类预测 | MATLAB实现KOA-CNN-BiLSTM开普勒算法优化卷积双向长短期记忆神经网络数据分类预测

分类预测 | MATLAB实现KOA-CNN-BiLSTM开普勒算法优化卷积双向长短期记忆神经网络数据分类预测 目录 分类预测 | MATLAB实现KOA-CNN-BiLSTM开普勒算法优化卷积双向长短期记忆神经网络数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现KOA-CNN-BiLST…

Windows安装人大金仓数据库问题解决

一、安装包、授权文件下载 官网下载windows对应的安装包 下载授权文件 二、安装 &#xff08;1&#xff09;将下载的授权文件包解压待用 &#xff08;2&#xff09;将下载好的.iso安装程序解压&#xff0c;使用管理员身份运行安装程序&#xff0c;一路下一步&#xff0c;直…

SpringBoot的流浪宠物系统

采用技术:springbootvue 项目可以完美运行

电动机监控系统在企业降碳过程中的作用-安科瑞黄安南

1.前言 据《2017-2022年中国电力工业产业专项调查及十三五市场商机分析报告》显示&#xff0c;从我国目前全社会用电结构来看&#xff0c;工商业用户耗电量约占 80%&#xff0c;其中电机耗电约占工业用电的 75%&#xff0c;全国总耗电的 60%&#xff0c;是用户终端耗电占比较大…

2023 IDC中国数字金融论坛丨中电金信向行业分享“源启+应用重构”新范式

9月8日&#xff0c;IDC主办的“2023 IDC中国数字金融论坛”在北京召开。中电金信受邀参会&#xff0c;并带来了深度数字化转型趋势之下关于应用重构的分享与洞见。 论坛重点关注金融科技创新发展趋势与数字化转型之路&#xff0c;中电金信副总经理、研究院院长况文川带来了“创…

“揭秘淘宝店铺所有商品接口:一键获取海量热销宝贝信息!“

淘宝店铺所有商品接口可以通过shop id或店铺主链接获取到整店商品&#xff0c;数据包括&#xff1a;商品ID&#xff0c;图片地址&#xff0c;店铺标题&#xff0c;优惠价&#xff0c;价格&#xff0c;销量&#xff0c;宝贝链接等整个店铺的商品。 要使用这个接口&#xff0c;需…

4.物联网射频识别,RFID开发【智能门禁项目】

补充&#xff1a;学习路径 一。项目介绍及需求分析 1.酒店智能门禁使用场景介绍 1.客人入住 客人在前台办理入住手续&#xff0c;前台管理员通过门禁管理系统为客户开一张门禁卡 客户持卡到相应客房&#xff0c;用IC 卡刷卡开门 客人过了入住时间后&#xff0c;卡自动失效&a…

【简单的留言墙】HTML+CSS+JavaScript

目标&#xff1a;做一个简单的留言墙 1.首先我们用HTML的一些标签&#xff0c;初步构造区域 样式。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>留言墙</title><style>/* ...... */ …

Charles:移动端抓包 / windows客户端 iOS手机 / 手机访问PC本地项目做调试

一、背景描述 1.1、本文需求&#xff1a;移动端进行抓包调试 1.2、理解Charles可以做什么 Charles是一款跨平台的网络代理软件&#xff0c;可以用于捕获和分析网络流量&#xff0c;对HTTP、HTTPS、HTTP/2等协议进行调试和监控。使用Charles可以帮助开发人员进行Web开发、调试…

pytorch_神经网络构建2(数学原理)

文章目录 深层神经网络多分类深层网络反向传播算法优化算法动量算法Adam 算法 深层神经网络 分类基础理论: 交叉熵是信息论中用来衡量两个分布相似性的一种量化方式 之前讲述二分类的loss函数时我们使用公式-(y*log(y_)(1-y)*log(1-y_)进行误差计算 y表示真实值,y_表示预测值 …

使用postman 调用 Webservice 接口

1. 先在浏览器地址栏 访问你的webService地址 地址格式: http://127.0.0.1:8092/xxxx/ws(这个自己的决定)/xxxxXccv?wsdl 2. post man POST 访问wwebService接口 地址格式: http://127.0.0.1:8092/xxxx/ws(这个自己的决定)/xxxxXccv <soapenv:Envelope xmlns:soapenv…

Flink session集群运维

1、集群job manager挂了 kubectl describe pod session-deployment-only-84b8d674c7-ckl9w -n flink kubectl get pod -n flink -owide kubectl describe pod session-deployment-only-84b8d674c7-ms758 -n flink 两个job manager都挂了 准备重新部署集群 删除操作(删除fli…

C语言打印菱形

一、运行结果图 二、源代码 # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int line 0;int i 0;int j 0;//获取变量值&#xff1b;scanf("%d", &line);//循环打印上半部分&#xff1b;for (i 0; i <…

【Redis】Redis中的数据结构和内部编码

Redis中的数据结构和内部编码 type命令实际返回的就是当前键的数据结构类型&#xff0c;它们分别是&#xff1a;string&#xff08;字符串&#xff09;、list&#xff08;列表&#xff09;、hash&#xff08;哈希&#xff09;、set&#xff08;集合&#xff09;、zset&#xf…

WebDAV之π-Disk派盘 + 咕咚云图

咕咚云图是一款强大的图床传图软件,它能够让您高效地对手机中的各种图片进行github传输,多个平台快速编码上传,支持远程删除不需要的图片,传输过程安全稳定,让您可以很好的进行玩机或者其他操作。 可帮你上传手机图片到图床上,并生成 markdown 链接,支持七牛云、阿里云…

UE4 Unlua 初使用小记

function M:Construct()print(Hello World)print(self.Va)local mySubsystem UE4.UHMSGameInstanceSubsystemUE4.UKismetSystemLibrary.PrintString(self,"Get Click Msg From UnLua ")end unlua中tick不能调用的问题&#xff1a; 把该类的Event Tick为灰色显示的删…

SpringCloud学习笔记-Eureka的服务拉取

目录 1.依然需要在该服务里面引入依赖2.在OrderService里面需要有如下配置3.修改URL和OrderService中添加Load Balanced注解1.修改URL2.OrderService中添加Load Balanced注解 假设是OrderService里面拉取Eureka的服务之一User Service 1.依然需要在该服务里面引入依赖 <dep…