JS中call()、apply()、bind()改变this指向的原理

大家有没有想过这三种方法是如何改变this指向的?我们可以自己写吗?

答案是:可以自己写的

让我为大家介绍一下吧!

1.call()方法的原理

javascript 复制代码
	Function.prototype.calls = function (context, ...a) {
		// 如果没有传或传的值为空对象 context指向window
		if (typeof context == null || context == undefined) {
			context = window;
		}
		// 创造唯一的key值  作为我们构造的context内部方法名
		let fn = Symbol();
		// this指向context[fn]方法
		context[fn] = this;
		return context[fn](...a);
	}
	let obj = {
		func(a,b){
			console.log(this);
			console.log(this.age);
			console.log(a);
			console.log(b);
		}
	}
	let obj1 = {
		age:"张三"
	}
	obj.func.calls(obj1,1,2);

打印结果:

2.apply()方法的原理

javascript 复制代码
	// apply与call原理一致  只是第二个参数是传入的数组
	Function.prototype.myApply = function (context, args) {
		if (!context || context === null) {
			context = window;
		}
		// 创造唯一的key值  作为我们构造的context内部方法名
		let fn = Symbol();
		context[fn] = this;
		// 执行函数并返回结果
		return context[fn](...args);
	};
	let obj = {
		func(a, b) {
			console.log(this);
			console.log(this.age);
			console.log(a);
			console.log(b);
		}
	}
	let obj1 = {
		age: "张三"
	}
	obj.func.myApply(obj1, [1,2]);

打印结果:

3.bind()方法的原理

javascript 复制代码
	Function.prototype.myBind = function (context) {
		// 如果没有传或传的值为空对象 context指向window
		if (typeof context === "undefined" || context === null) {
			context = window
		}
		let fn = Symbol(context)
		context[fn] = this //给context添加一个方法 指向this
		// 处理参数 去除第一个参数this 其它传入fn函数
		let arg = [...arguments].slice(1) //[...xxx]把类数组变成数组 slice返回一个新数组
		context[fn](arg) //执行fn
		delete context[fn] //删除方法
	}
	let obj = {
		func(a) {
			console.log(this);
			console.log(this.age);
		}
	}
	let obj1 = {
		age: "张三"
	}
	obj.func.myBind(obj1);

打印结果:

感谢大家的阅读,如有不对的地方,可以向我提出,感谢大家!

相关推荐
变与不变80612 分钟前
jQuery怎么使用
前端·javascript
paopaokaka_luck26 分钟前
流浪动物救助与收养系统(DeepSeek AI对话、 ECharts多维分析、救助流程衔接、领养与回访衔接、 捐赠确认与公示、志愿者协作)
java·前端·javascript·人工智能·mysql·echarts·推荐算法
仰望.31 分钟前
vue 表格组件 vxe-table 树表格懒加载支持拖拽排序的详细用法
前端·javascript·vue.js·vxe-table
程序 代码狂人40 分钟前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
meiying88382 小时前
快递单号批量查询Python脚本:从手动到自动化的完整实现
开发语言·python·自动化
程序员初一3 小时前
我把跑了两年 WordPress 的机器重装了一遍,顺便把面板卸了
javascript
@大迁世界3 小时前
告别 Go,拥抱 Rust
开发语言·golang·rust
SEO_juper3 小时前
Node.js 重定向链检测工具:301 跳了几跳、有没有成环,一次看清
xml·开发语言·python·node.js·json·bash
kyriewen3 小时前
别再用防抖做懒加载了:120 张图只加载出 4 张
前端·javascript·程序员
学逆向的3 小时前
C 指针常量与常量指针
c语言·开发语言·网络安全