call、apply、bind能用来干点啥(接上文)

news2024/12/23 10:37:46

上文我们了解了call、apply、bind的使用规则,学以致用,我们要在平时的搬砖中怎么使用呢?

其实好些人平时也用不到这三货,但是在框架底层,这三货可是经常被用到的啊,现在我们来了解了解吧

  • 1、处理伪数组

假使,在html页面中有多个名为“c-container”的容器,现在我们来获取他们,并且把他们赋值给一个变量list

let list = document.getElementsByClassName('c-container')

然后我们来看看list
在这里插入图片描述

然后,我们想获取list中div#2、div#3的node,那能不能使用slice来截取出来呢?下面我们来试试

list.slice(2,4) //Uncaught TypeError: list.slice is not a function

报错了,说明list上面没有slice的方法,我们用不了,那是不是我们只能通过for循环才能找到呢,其实也不用,我们来使用call吧

[].slice.call(list, 2,4) //(2) [div#2.result-op.c-container.new-pmd, div#3.result.c-container.xpath-log.new-pmd]

是不是很简单呢,只需借用数组上的方法来操作伪数组即可.

这里需要说一下,什么是伪数组

  • 有length属性
  • 能按索引存储数据
  • 能像遍历数组一样来遍历
  • 不能使用数组的push()、slice()等方法

常见的伪数组包括:

  • 函数内部的arguments对象
  • 通过getElementsByTagName、document.childNodes等方式获取的NodeList集合。jQuery中的DOM元素集。

要将伪数组转换为真正的JavaScript数组,可以使用以下方法:

  • 使用扩展运算符(…)。
  • 使用Array.from(伪数组)。这个方法也会创建一个新的数组,包含伪数组中的元素。与slice方法不同,Array.from方法还可以接受一个映射函数作为参数,用于转换元素。
  • 使用Array.prototype.slice.call(伪数组)

上面转换的第三种方法就是利用的call,这里没有传递参数,所以slice方法会返回原数组,即将伪数组转换为真数组

  • 2、实现继承

利用call来实现构造函数的继承,不废话,直接上代码看看哈

单继承

function Person(name){
    this.name = name
}
function User(age, name){
    Person.call(this, name);
    this.age = age;
    console.log('my name is ' + this.name + ' i am ' + this.age + ' years old')
}
let mikeObj = new User(18, 'mike')  // my name is mike i am 18 years old

多继承

function Favorite(sport){
    this.sport = sport
}
function Person(name){
    this.name = name
}
function User(name, sport){
    Person.call(this, name)
    Favorite.call(this, sport)
    console.log('My name is ' + this.name + ',my Favorite is ' + this.sport)
}

let obj = new User('jhon', 'football') // My name is jhon,my Favorite is football

可以看到我们通过call等方法实现构造函数的继承

  • 3、bind实现this的绑定

在上一篇文章,提到过函数中的this和它执行的作用域有关,和它定义的的作用域没有关系,我们在日常使用中,其实有时候会想让函数执行的作用域就固定在定义它的地方,那我们要如何操作呢

我们来看代码

let obj = {
    name: 'mike',
    getName(){
        return function(){
            console.log(this.name)
        }
    }
}
var name = 'lili'
let getName = obj.getName()
getName(). // lili. 

我们利用bind来绑定obj的作用域

let obj = {
    name: 'mike',
    getName(){
        return function(){
            console.log(this.name)
        }.bind(this)
    }
}
var name = 'lili'
let getName = obj.getName()
getName(). // mike
  • 4、取数组的最大、最小值
    这里用到apply的一个默认功能,展开数组
let array  = [1,2,5,9,100]
Math.max.apply(null, array)  //100
Math.min.apply(null, array). //1
  • 5、合并数组

常用到的合并数组的方法有 循环、push、concat、展开符号…,现在我们再来看看apply

let array  = [1,2,5,9,100]
[].push.apply(array, ['a','b'])
array. //[1, 2, 5, 9, 100, 'a', 'b']

以上就是最常用到几种情况,多用才能加深印象哈

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[机缘参悟-166] :周期论:万物的周期现象是这个世界有序性和稳定性保障;超越周期:在轮回中,把握周期节奏。

目录 前言:超越周期 一、周期是大自然和宇宙的规律,是天道 1.1 概述 1.2 万物的周期规律的现象 1.3 电磁波的周期 二、计算机世界中的周期性 三、佛家的生命轮回规律 四、人类社会发展的周期规律 五、经济活动的周期规律 5.1 概述 5.2 股市的…

分享一个网站实现永久免费HTTPS访问的方法

免费SSL证书作为一种基础的网络安全工具,以其零成本的优势吸引了不少网站管理员的青睐。要实现免费HTTPS访问,您可以按照以下步骤操作: 一、 选择免费SSL证书提供商 选择一个提供免费SSL证书的服务商。如JoySSL,他们是国内为数不…

ArgoCD集成部署到Kubernetes

1:环境 kubernetes1.23.3ArgoCD2.3.3 2:ArgoCD介绍 Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes. Argo CD是一个基于Kubernetes的声明式的GitOps工具。 那么,什么是GitOps呢? GitOps是以Git为基…

ROS 2边学边练(36)-- 添加一个坐标系(C++)

前言 此篇将会在之前已存在的几个坐标系(/world、/turtle1、/turtle2)的基础上再增加一个坐标系,相对来说,难度不大,主要是理解一些概念(脑子里面有3D场景的想象),比如一个小车机器人处在世界坐标系&#x…

春秋云镜 CVE-2023-50563

靶标介绍: SEMCMS是一套支持多种语言的外贸网站内容管理系统(CMS)。SEMCMS v4.8版本存在SQLI,该漏洞源于SEMCMS_Function.php 中的 AID 参数包含 SQL 注入 开启靶场: 开始实验: 1、使用后台扫描工具&…

QT学习之QtXlsx

背景: 本来我是想提取xml中的信息存在xlsx文件中的,网上很多说是使用QtXlsx; 于是我找了一些帖, 像:https://www.cnblogs.com/liming19680104/p/14398459.html; 大家的说法都是安装第三方库到QT中&#xff…

社交媒体数据恢复:Skype国内、际版

恢复已删除的Skype聊天记录可能需要一些操作,但请注意,这不一定总是可行的,并且可能需要一些技术知识。以下是一些步骤,您可以尝试恢复您的Skype聊天记录: 1. 检查备份: - 如果您有Skype备份&#xff0…

【行为型模式】备忘录模式

一、备忘录模式概述 备忘录模式定义:又称之为快照模式(Snapshop Pattern)或者令牌模式(Token Pattern),是指在不破坏封装的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态,这样我们就可以在需要的时候将该对…

软件测试的内容包含什么内容

软件测试的内容涵盖了多个方面,以确保软件的质量和性能达到既定的标准。这些内容包括但不限于以下几点: 注册信息验证:对软件产品的基本信息进行验证,如软件名称、版本号、开发者等,确保这些信息的准确性和一致性。功…

Mysql事务—隔离级别—脏读、不可重复读、幻读-遥遥领先版

事务的基本概念 事务就是一组原子性的操作,这些操作要么全部发生,要么全部不发生。事务把数据库从一种一致性状态转换成另一种一致性状态。 事务最经典也经常被拿出来说例子就是转账了。 假如小明要给小红转账1000元,这个转账会涉及到两个…

Java全栈开发前端+后端(全栈工程师进阶之路)-环境搭建

在课程开始前我们要配置好我们的开发环境,这里我的电脑太乱了,我使用vm虚拟机进行搭建开发环境,如果有需要环境的或者安装包,可以私信我。 那我们开始 首先我们安装数据库 这里我们使用小皮面板 小皮面板(phpstudy) - 让天下没…

【一刷《剑指Offer》】面试题 11:数值的整数次方

力扣对应题目链接:50. Pow(x, n) - 力扣(LeetCode) 牛客对应题目链接:数值的整数次方_牛客题霸_牛客网 (nowcoder.com) 一、《剑指Offer》内容 二、分析题目 【快速幂 递归】 当指数 n 为负数时,我们可以计算 x^(−…

大模型应用开发极简入门

简单的归纳一下书的前序部分 目录 LLM(Large Language Model)的应用技术栈通常包括以下几个方面: 深度学习框架: 数据预处理工具: 训练资源: 模型优化和调参工具: 部署和应用集成&#xf…

基于Vue3的Axios异步请求

基于Vue3的Axios异步请求 1. Axios安装与应用2. Axios网络请求封装3. axios网络请求跨域前端解决方案server.proxy 1. Axios安装与应用 Axios是一个基于promise的网络请求库,Axios.js.中文文档:https://axios.js.cn/ 安装:npm install --sa…

链表之两数相加

两数相加 题目: 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&am…

简单几步!新手开抖店如何快速上手?看这一篇就够了!

大家好,我是电商花花。 很多新手卖家在做抖音小店的时候都是0基础的小白,在开好店铺之后却不知道如何下手。 那么今天花花就来跟 大家分享一下我们是怎么做抖音小店,怎么做店铺运营的,如果你作为一个刚开店的新手,一…

Java的逻辑控制和方法的使用介绍

前言 程序的逻辑结构一共有三种:顺序结构、分支结构和循环结构。顺序结构就是按代码的顺序来执行相应的指令。这里主要讲述Java的分支结构和循环结构,由于和C语言是有相似性的,所以这里只会提及不同点和注意要点~~ 注意在C语言中,…

MobileNetV4 论文学习

论文地址:https://arxiv.org/abs/2404.10518 代码地址:https://github.com/tensorflow/models/blob/master/official/vision/modeling/backbones/mobilenet.py 解决了什么问题? 边端设备的高效神经网络不仅能带来实时交互的体验&#xff0c…

Linux服务器安全基础 - 查看入侵痕迹

1. 常见系统日志 /var/log/cron 记录了系统定时任务相关的日志 /var/log/dmesg 记录了系统在开机时内核自检的信息,也可以使用dmesg命令直接查看内核自检信息 /var/log/secure:记录登录系统存取数据的文件;例如:pop3,ssh,telnet,ftp等都会记录在此. /var/log/btmp:记…

XYCTF 2024

Web 参考博客:https://www.yuque.com/yunzhiyunweiji/wrgkex/rfpnkn0293l7cp09#ezMake ezhttp Via - HTTP | MDN 代理那里难住了 XFF不给用可以用client-ip ezmd5 让我们上传图片并比较,结合题目名可以猜测应该是比较两个图片的md5值是否相同&…