JavaScript 进阶营

javascript bind 方法封装

2019-03-25  本文已影响0人  随Sir

javascript bind 方法封装

Function.prototype.bind方法非常强大,可以绑定一个函数的上下文可以帮我们解决很多问题,有没有好奇这样强大的方法究竟在底层是怎么实现的呢?本文来告诉你

首先我们来看看bind方法的作用:

function func() {
     console.log(this.a, Array.prototype.slice.call(arguments));
}
var a = 10;
var obj = {
   a: 20
}
func(1);//10 [1]
var newfunc = func.bind(obj,1,2,3);
console.log(newfunc===func)//false
newfunc(4,5,6);//20 [1,2,3,4,5,6]
var obj1=new newfunc();//undefined [1,2,3]
obj1.a=30;
console.log(obj===obj1,obj1.a,obj.a)//false 30 20

根据上面的代码我们得出:

封装思路:

所以有以下代码:

Function.prototype.myBind = function (ctx) {
  var that = this,//预存this 即实际执行的那个函数 func.mybind()内部this指向func
    slice = Array.prototype.slice;//预存数组分割方法
  var outsideArg = slice.call(arguments, 1);//从第一位开始截取 
  fun.prototype.__mypro__=true;
   function fun() {
    //返回一个新的函数 实际上执行的还是外面的this即你调用bind方法的那个函数
    var insideArg = slice.call(arguments, 0);//里面函数的参数
    var contex=this.__mypro__?this:ctx;/*如果this找得到__mypro__说明是new执行无需改变this*/
    return that.apply(contex,outsideArg.concat(insideArg)/*将内外参数连接起来*/);
  }; 
  return fun;
}

经过测试新封装的myBind方法跟原来的bind方法功能一致 myBind方法封装成功

上一篇 下一篇

猜你喜欢

热点阅读