JS手写实现call、apply、bind
目录
写在前面
call手写实现
apply手写实现
bind手写实现
写在前面
今天的主题是手写实现某些常见的js函数。在JavaScript中,我们知道改变一个函数的this指向,一般来说有这样三个函数可以帮助我们做到这样的效果,分别是call、apply、bind。但是三个函数又有所区别,具体的区别我就不详述了,大家可以去call、apply、bind详细介绍看看详细的介绍。
call手写实现
var age = 16;var gender = 'female';var obj = {age: 11,gender: 'male'}function Test(a, b) {console.log(this.age);console.log(this.gender);comsole.log(a);comsole.log(b);}
我们先来看看js的原生call函数的效果,请看下面代码:
Test(3, 5);Test.call(obj, 22, 33);
其输出结果如下:
ok,下面我们来自己首先代码实现我们自己的call函数,show you the code:
Function.prototype.myCall = function (obj, ...args) {obj.fn = this;let res = obj.fn(...args);delete obj.fn;return res;}
同样的,我们来调用我们的myCall函数:
Test.myCall(obj, 22, 33);
输出如下:
很显然,我们已经实现了call函数的功能,下面我们简单的分析一下实现的原理及思路:首先myCall函数是挂载在Function构造函数的原型上的,这没什么好解释的,大家都懂;其次,我们都知道调用myCall函数的第一个参数为this的指向,所以第一个参数单独写,然后怎样让函数的调用时this指向这个参数呢?这时我们可以利用对象的方法调用时,其方法的his指向此对象,所以我们把原函数当作一个方法挂载在第一个参数obj上,所以我们可以看到 obj.fn = this; 这行代码,此时就实现了改变this的指向,此时最最重要的部分已经被我们解决了,接下来的事情不多说了,水到渠成。
apply手写实现
先来看看apply的调用及调用后的效果:
Test.apply(obj, [36, 37]);// 输出如下:11"male"3637
下面开始实现我们自己的apply:
Function.prototype.myApply = function(obj, args) {obj.fn = this;let res;if (args && args.length) {res = obj.fn(...args);} else {res = obj.fn();}delete obj.fn;return res;}
下面调用一下我们自己的myApply函数试试看效果:
Test.myApply(obj, [55, 56]);// 输出如下:11"male"5556
可以看到,我们自己手写的myApply函数同样是达到了效果,原理同上就不在此赘述了。
bind手写实现
这里,我们直接手写我们自己的bind函数,就不再赘述原生的bind函数了,直接上code:
Function.prototype.myBind = function(obj, ...args) {obj.fn = this;return function() {const newArgs = args.concat(...arguments);let ret = obj.fn(...newArgs);delete obj.fn;return ret;}}
调用我们自己的myBind函数看看效果:
Test.myBind(obj, 66, 67)();Test.myBind(obj, 77)(78);// 分别输出如下:11"male"666711"male"7778
JS手写实现call、apply、bind相关推荐
- 一文帮你搞定90%的JS手写题
还在害怕手写题吗,本文可以帮你扩展并巩固自己的JS基础,顺便搞定90%的手写题.在工作中还可以对常用的需求进行手写实现,比如深拷贝.防抖节流等可以直接用于往后的项目中,提高项目开发效率.不说废话了,下 ...
- 【面试】970- 一文帮你搞定90%的JS手写题
还在害怕手写题吗,本文可以帮你扩展并巩固自己的JS基础,顺便搞定90%的手写题.在工作中还可以对常用的需求进行手写实现,比如深拷贝.防抖节流等可以直接用于往后的项目中,提高项目开发效率.不说废话了,下 ...
- 用 Node.js 手写一个 DNS 服务器
DNS 是实现域名到 IP 转换的网络协议,当访问网页的时候,浏览器首先会通过 DNS 协议把域名转换为 IP,然后再向这个 IP 发送 HTTP 请求. DNS 是我们整天在用的协议,不知道大家是否 ...
- [js] 手写一个trim()的方法
[js] 手写一个trim()的方法 function trim(str) { if (str[0] === ' ' && str[str.length - 1] === ' ') { ...
- 2020年前端面试之JS手写代码题合集
2020年前端面试之JS手写代码题合集 预计会有上千道题,后续慢慢补! 1. 写一个把字符串大小写切换的方法 function caseConvert(str){return str.replace ...
- JS手写上传文件、React手写上传文件
目录 JS手写 React上传文件 JS手写 <!DOCTYPE html> <html lang="en"><head><meta ch ...
- 致敬科比,JS 手写贪吃蛇
用 JS 手写贪吃蛇,致敬黑曼巴科比,实现功能有: 开始/暂停/继续游戏 简单/一般/困难选择 游戏积分榜 暗黑/紫金模式切换 在本场 Chat 中,会讲到如下内容: Bootstrap 组件使用 页 ...
- 手写 call、apply 及 bind 函数
之前在bind和apply以及call函数使用中详解总结过bind和apply以及call函数的使用,下面手写一下三个函数. 一.首先call函数 Function.prototype.MyCall ...
- 2021年的几次面试让我死磕了17道JS手写题!
1.浅拷贝.深拷贝的实现 浅拷贝 // 1. ...实现 let copy1 = {...{x:1}}// 2. Object.assign实现 let copy2 = Object.assign({ ...
- JS手写数组扁平化(flat)方法
方法介绍 数组扁平化方法 Array.prototype.flat() 也叫数组拍平.数组拉平.数组降维. Array.prototype.flat() 用于将嵌套的数组"拉平", ...
最新文章
- 对端边缘云网络计算模式:透明计算、移动边缘计算、雾计算和Cloudlet
- Knowledge Point 20180305 数据在计算机中的表示
- python twisted教程_Python Twisted系列教程16:Twisted 进程守护
- 2021最大看点AI for Science,在哪些领域有斩获?
- Java基础-关于session的详细解释
- Python--day6
- Nginx-基础使用
- 怎么创建数据表的实体类和业务类_怎样创建一个网站?
- 对于 Netty ByteBuf 的零拷贝(Zero Copy) 的理解
- WAF(NGINX)中502和504的区别
- JS函数表达式的特征和递归
- 字符串替换(NYOJ)
- 春天不健脾养胃 也要等什么时候
- 设计模式分析——迭代器模式(Iterator)
- 【MySQL】浅谈MySQL中索引的基本操作以及背后的数据结构
- OE链面临区块链生态新机遇
- 【教程】超详细通过Shizuku集成XQ_Crystal实现收森林能量
- STGCN的源码分析
- JavaWeb项目实践
- 1.单例模式之饿汉式
热门文章
- OJ 	2306 Problem C	Banana
- C语言程序设计——从入门到进阶,C语言程序设计——从入门到进阶-巨同升主编.pdf(3)...
- 引用第三方SDK产生依赖冲突
- android跳转到rn界面,第五章 RN与Native—由原生页面跳转到Rn页面;在Rn页面调用Android Native组件和Native数据...
- 女性三围的检测验证js-------格式 20,30,40
- iPhone/iPad各机型如何进入恢复模式 苹果进入恢复模式的方法
- NLP系列(8)_用可视化解构BERT,从上亿参数中提取出的6种直观模式
- 苹果电脑可以装windows系统吗_苹果电脑MacBook双系统安装好后,如何下载Windows支持组件?...
- Confluence 摘要(Excerpt)宏
- ubuntu桌面图标不显示问题