实现 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的主要内容,如果未能解决你的问题,请参考以下文章

js中call,apply,bind的实现原理()

call() apply() bind()方法 以及实现bind()方法

原生JS实现call,apply,bind函数

原生实现JavaScript的call()apply()bind()

原生实现JavaScript的call()apply()bind()

原生实现JavaScript的call()apply()bind()