在没风的地方找太阳  在你冷的地方做暖阳 人事纷纷  你总太天真  往后的余生  我只要你 往后余生  风雪是你  平淡是你  清贫也是你 荣华是你  心底温柔是你  目光所致  也是你 想带你去看晴空万里  想大声告诉你我为你着迷 往事匆匆  你总会被感动  往后的余生  我只要你 往后余生  冬雪是你  春花是你  夏雨也是你 秋黄是你  四季冷暖是你  目光所致  也是你 往后余生  风雪是你  平淡是你  清贫也是你 荣华是你  心底温柔是你  目光所致  也是你
jQuery火箭图标返回顶部代码 - 站长素材

自己实现一个call、apply、bind方法

1、call的实现

思路,js中this是根据上下文来决定的,如果是一个方法,this指向这个方法被调用的对象

//如何自己实现一个call
Function.prototype.myCall = function() {
  //obj即相当于上面的k
  var [obj, ...args] = arguments;
  console.log({arguments})
  
  //this相当于上面的a
  obj['fn'] = this;
  //获取call第二个开始的参数
  
  //相当于k.a, 即将a的this指向k
  obj['fn'](...args);

  delete obj['fn'];
}

function a(n){
  console.log(this.m, n);
}

var k = {
  m: 2
}

a.myCall(k, 1);

Function.prototype.myCall = function() {
    let [context, ...args] = arguments
    let funNane = Symbol('fn')
    context[funNane] = this
    context[funNane](...args)
    delete context[funNane]
}

 

2、实现一个apply

//如何自己实现一个apply
Function.prototype.myApply = function() {
  //obj即相当于上面的k
  var [obj, args] = arguments;
  console.log({arguments})
  
  //this相当于上面的a
  obj['fn'] = this;
  //获取call第二个开始的参数
  
  //相当于k.a, 即将a的this指向k
  obj['fn'](...args);

  delete obj['fn'];
}

function a(n, p){
  console.log(this.m, n, p);
}

var k = {
  m: 2
}

a.myApply(k, [1, 3]);

Function.prototype.myApply = function() {
    let [context, args] = arguments
    let funNane = Symbol('fn')
    context[funNane] = this
    context[funNane](...args)
    delete context[funNane]
}

 

3、实现一个bind

Function.prototype.myBind = function(object) {
    let obj = object || window;
    obj.fn = this;
    let arg = [...arguments].slice(1);
    return function() {
        obj.fn.apply(object, arg);
    }
}

或 

Function.prototype.myBind = function() {
    console.log(arguments)
    let [context, ...args] = arguments
    let funNane = Symbol('fn')
    context[funNane] = this
    return () => context[funNane](...args)
}

 

 
posted @ 2021-03-29 11:31  艺术诗人  阅读(85)  评论(0编辑  收藏  举报