实现 call apply bind
Posted auserroot
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现 call apply bind相关的知识,希望对你有一定的参考价值。
// call apply bind 都是 function 原型上的方法
// call 传入 this指向的对象 传入参数 列表
Function.prototype.myCall = function (context,...args)
if (context===null||typeof context === undefined)
context = window //如果 context 传入 null 或 undefined 则 this 指向 window
//传入值为对象
context.f = this //用自定义键保存this
console.log(context,args)
const res = context.f(...args)//call 传入参数列表
delete context.f // 执行完方法后删除属性 (调用一次会向context上添加一次属性,多次调用后context上属性会过多)
return res //将结果返回
// function A(a)
// this.a = a
// console.log(a)
//
// function B(a)
// A.myCall(this,a,2,3,4)
// console.log(a)
//
// B(1)//test
//apply 与call的唯一区别 传入 数组或数组对象
Function.prototype.myApply = function(context,args)
if (context===null||typeof context === undefined)
context = window //如果 context 传入 null 或 undefined 则 this 指向 window
// //传入值为对象
context.f = this //用自定义键保存this
console.log(context,args)
const res = context.f(args)//传入数组参数
delete context.f
return res
//function A(a)
//this.a = a
//console.log(a)
//
//function B(a)
// A.myCall(this,a,2,3,4)
//A.myApply(this,a,1,2,3)
//console.log(a)
//
// B(1)//test
//bind 返回 一个新函数
Function.prototype.myBind = function (context,...args)
//保存 this
let that = this
//返回一个函数
return function f(...param)
//param 是调用方法的实例本身的参数
// 判断是否做为 构造函数使用
if(that instanceof f)
// return that.apply(this,...param,...args) //直接 new 更简洁
return new f(...param,...args) //返回一个 实例 将参数全传给实例
return that.apply(context,...args,...param) //不是构造函数 改变指向 将参数传给 返回函数
//const c =
//x: 42,
//getX: function()
//return this.x;
//
//;
//const X = c.getX;
//console.log(X());
//const GetX = X.myBind(c);
//console.log(GetX());
以上是关于实现 call apply bind的主要内容,如果未能解决你的问题,请参考以下文章
call() apply() bind()方法 以及实现bind()方法
原生实现JavaScript的call()apply()bind()