call, apply , bind 区别详解 及 实现购物车业务开发实例

call 方法:

原理

call 方法允许一个对象借用另一个对象的方法。通过 call,你可以指定某个函数运行时 this 指向的上下文。本质上,call 改变了函数运行时的作用域,它可以让我们借用一个已存

在的函数,而将函数体内的 this 绑定到当前对象。

function displayInfo(age, job) {console.log(`${this.name} is ${age} years old and is a ${job}.`);
}const person = {name: 'Alice'
};// 使用 call 调用函数,同时将 this 设置为 person 对象
displayInfo.call(person, 30, 'developer');
// 输出: Alice is 30 years old and is a developer.

apply方法:

原理

applycall 非常相似,差别仅在于 apply 接受一个参数数组,而不是一组参数列表。这在你需要传递一个数组数据作为调用函数的参数时特别有用。比如,当你使用 Math.max() 计算数组中的最大值时,可以使用 apply

function displayInfo(age, job) {console.log(`${this.name} is ${age} years old and is a ${job}.`);
}const person = {name: 'Alice'
};// 使用 apply 调用函数,传递参数数组
displayInfo.apply(person, [30, 'developer']);
// 输出: Alice is 30 years old and is a developer.

bind方法:

bind 方法创建一个新的函数,当被调用时,这个新函数的 this 被指定为 bind 的第一个参数,而其余参数将作为新函数的参数,供调用时使用。

function greet(greeting, punctuation) {console.log(`${greeting}, my name is ${this.name}${punctuation}`);
}const person = { name: 'Alice' };
const sayHello = greet.bind(person, 'Hello');
sayHello('!');  // 输出: Hello, my name is Alice!

原理解析

  • callapply 的区别 主要在于参数的传递方式。call 需要将参数按顺序一个接一个地传递,而 apply 则是把参数放在一个数组中传递。
  • bind 则是返回一个新的函数,允许你预设 this 参数和其他参数,之后可以随时调用。

这三个方法都是函数原型上的方法,即 Function.prototype,因此在JavaScript中所有函数都可以使用这些方法。这些方法的主要用途是控制函数执行时 this 关键字的值。

代码:

//商品购物车 套版  函数
function ShoppingCart(){this.items = []this.total = 0//this.total = items.length ?}
//如果需要后续绑定this 对象,谨慎用箭头函数 (call,bind,apply 影响不了他的this)
ShoppingCart.prototype.addItem = function (item){this.items.push(item)this.total += item.priceconsole.log(`${item.name} add successfully . Total is ${this.total}`)
}
ShoppingCart.prototype.removeItem = function (itemName){const itemIndex = this.items.findIndex(item => item.name === itemName)if(itemIndex > -1){this.total -= this.items[itemIndex].pricethis.items.splice(itemIndex,1)console.log(`${itemName} remove successfully.Total is ${this.total}`)}
}
//使用call 、apply
const p1 = {name:'书包',price:221
}
const p2 = {name:'书',price:12
}
const cart = new ShoppingCart()
//call适合一个对象 ,apply适合数组对象(必须是一个数组)
//两者都只会临时更改对象一次this 指向方向
cart.addItem.call(cart,p1)
cart.addItem.apply(cart,[p1, p2])
//bind 方法
const gadget = { name: 'Echo Dot', price: 49.99 }
// 创建一个永久绑定到 cart 的 addItem 方法
const boundAddItem = cart.addItem.bind(cart)
// 添加商品
boundAddItem(gadget)

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

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

相关文章

解决windows中的WS Llinux子系统(unbantu2204)访问网络失败问题?

一、问题描述 unbantu先前可以正常访问网络,后面用着用着发现上不了网了, 出现如下异常 Hmm. We’re having trouble finding that site.We can’t connect to the server at www.iqiyi.com.If you entered the right address, you can:Try again late…

每日一题 礼物的最大价值

题目描述 礼物的最大价值_牛客题霸_牛客网 解题思路 这是一个典型的动态规划问题。我们可以使用一个二维数组 dp[][] 来存储到达每个格子时可以获得的最大价值。状态转移方程为 dp[i][j] max(dp[i-1][j], dp[i][j-1]) grid[i][j],表示到达当前格子的最大价值是从…

云原生之Docker篇第一章 Docker 概述与安装

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 系列文章目录 云原生之…

76.网络游戏逆向分析与漏洞攻防-移动系统分析-分析角色移动产生的数据包

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果,代码看不懂是正常的,只要会抄就行,抄着抄着就能懂了 内容…

图:广度优先遍历(BFS)和深度优先遍历(DFS)

1.工具类:队列和字典 export class DictionNary {// 字典的封装constructor() {this.items {}}set(key, value) {// 添加键this.items[key] value}has(key){// 判断键是否存在return this.items.hasOwnProperty(key)}get(key){// 获取键的valuereturn this.has(k…

EOCR-ELR-30RM7Q电机保护器 施耐德韩国三和

EOCR-ELR-30RM7Q电机保护器 施耐德韩国三和 基于MCU(微处理器)的密集型设计 精确的接地故障保护功能 电力系统和电动机的接地故障保护 零序电流互感器监测接地故障 电流和故障延时单独设定 LED显示电源输入和运行状态 嵌入式安装 EOCR主要产品有电子式电动机保护继电器&#xf…

2024年口碑最好的游泳耳机有哪些,这四款游泳耳机值得相信!

随着科技的不断进步和人们对健康生活的追求,游泳已经成为许多人健身和放松的首选运动之一。然而,想要在游泳时享受音乐的乐趣却一直是一个挑战。传统的耳机往往无法抵御水的侵蚀,导致音质下降或者设备损坏。因此,游泳耳机的问世成…

基于Springboot的校园新闻管理系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的校园新闻管理系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构…

VMware下Ubuntu的安装教程

文章目录 一、Ubuntu如何下载1.下载官方地址https://ubuntu.com/2.点选Ubuntu服务器版本3.点击下载Ubuntu服务器版本iso镜像二、VMware安装Ubuntu服务器系统1.创建虚拟机2.选择下载好的Ubuntu服务器镜像3.创建安装完成三、Ubuntu Server如何设置1.Ubuntu Server没有中文所以全都…

ILI9341显示驱动芯片的使用

ILI9341是一种常见的TFT LCD显示驱动芯片,它在众多的应用中都有广泛的使用。这种芯片的一个显著特点是它支持16位RGB565颜色,这意味着它可以显示多达65536种不同的颜色。这使得ILI9341能够提供鲜艳、生动的色彩效果,对于需要表现丰富色彩的应…

鸿蒙内核源码分析(中断管理篇) | 江湖从此不再怕中断

关于中断部分系列篇将用三篇详细说明整个过程. 中断概念篇 中断概念很多,比如中断控制器,中断源,中断向量,中断共享,中断处理程序等等.本篇做一次整理.先了解透概念才好理解中断过程.用海公公打比方说明白中断各个概念…

【练习2】

1.汽水瓶 ps:注意涉及多个输入&#xff0c;我就说怎么老不对&#xff0c;无语~ #include <cmath> #include <iostream> using namespace std;int main() {int n;int num,flag,kp,temp;while (cin>>n) {flag1;num0;temp0;kpn;while (flag1) {if(kp<2){if(…

做安卓应用开发的我,转前端开发了

距离转前端开发已经快3个月了&#xff0c;现在自己也慢慢的熟悉了开发。 在2月份的时候。领导找我们移动小组的谈话&#xff0c;主要是关于转前端或者后端的问题。由于公司移动端的选型&#xff0c;对安卓原生的需求降低&#xff0c;问下我们转其他开发的需求。 我毫不犹豫的选…

SAP-ABAP-定义变量05

1、定义变量的方式: 基本定义 直接使用TYPE * LENGTH * DATA: G_ZBJ TYPE C LENGTH 10, 参照表字段定义 DATA: G_ZBJ01 TYPE ZHY_XYXX_01-ZBJ. 参照数据元素定义 DATA: G_ZBJ02 TYPE ZHY_SJYS_05 , 也可以使用LIKE定义,DATA: G_ZBJ03 LIKE ZHY_XYXX_01-ZBJ,但是LIKE只能…

跟TED演讲学英文:4 pillars of college success in science by Freeman Hrabowski

4 pillars of college success in science Link: https://www.ted.com/talks/freeman_hrabowski_4_pillars_of_college_success_in_science Speaker: Freeman Hrabowski Date: February 2013 文章目录 4 pillars of college success in scienceIntroductionVocabularyTranscr…

MyBatis入门例子

1、建立与数据库对应的POJO类 2、建立mybatis的配置文件 修改后如下&#xff1a; 3、创建POJO对象和Mysql数据的表之间的映射配置 4、建一个测试方法 实现从数据库中取数一条数据&#xff0c;封装成User对象返回 注意点&#xff1a; 这点&#xff0c;大家应该不陌生了&#x…

笔记本连接不上远程桌面,笔记本无法连接远程桌面的可能原因及解决方法

在使用远程桌面功能时&#xff0c;笔记本无法成功连接的情况可能由多种原因引起。为了有效地解决这个问题&#xff0c;我们需要逐一排查这些可能的原因&#xff0c;并采取相应的解决措施。 首先&#xff0c;网络连接稳定性是远程桌面连接成功的关键。请确保笔记本和远程计算机之…

C语言猜数字游戏

用C语言实现猜数字游戏&#xff0c;电脑随机给出一个范围内的数字&#xff0c;用户在终端输入数字&#xff0c;去猜大小&#xff1b;对比数字&#xff0c;电脑给出提示偏大还是偏小&#xff1b;不断循环&#xff0c;直到正确 #include <stdio.h> #include <time.h>…

NXP i.MX8系列平台开发讲解 - 3.11 Linux PCIe设备调试(WIFI模块)

专栏文章目录传送门&#xff1a;返回专栏目录 文章目录 目录 1. WIFI 模块简单介绍 2. 设备驱动原理介绍 3. PCIE WIFI驱动实例分析 3.1 查看设备树 3.2 wifi 设备驱动代码分析 3.3 内核配置选项 4. WIFI驱动调试相关 根据前面对PCIe的讲解&#xff0c;对PCIe的整体都有…

数据分析必备:一步步教你如何用numpy改变数据处理(6)

介绍&#xff1a; NumPy 广播&#xff08;Broadcasting&#xff09;是指当两个形状不同的数组进行运算时&#xff0c;NumPy 有能力灵活地改变其中某个&#xff08;些&#xff09;数组的形状从而使得运算可以正常进行。 广播的规则主要包括以下几点&#xff1a; 当一个数组是一个…