手写Call bind

手写Call

Function.prototype.MyCall = function(context){
    var context  = context ?? window;
    let fnSymbol = Symbol();
    context[fnSymbol] = this;
    const arg = [...arguments].slice(1);
    let res = context[fnSymbol](...arg);
    delete context[fnSymbol]
    return res;
  }

  const obj = {
    name: '123',
  }

  function bar(gender,age){
    // 函数有返回值==》需要返回
    return {
      name:this.name,
      gender,
      age
    }
  }

  console.log(bar.MyCall(obj,['男',46]));

手写bind

    const obj = {
      name: '刘德华'
    }

    const person = function () {
      //该fn做为构造函数使用,此时的name为undefined
      console.log(this.name)
      console.log(arguments, 'arguments')
    }

    person.prototype.friend = '123123'

    Function.prototype.myBind = function (context, ...args) {
      const _this = this;
      const tempFun = function(){}
      const fn = function (...returnArgs) {
        _this.apply(this instanceof fn ? this : context, [...args, ...returnArgs])
      }
      tempFun.prototype = this.prototype;
      fn.prototype = new tempFun();
      return fn
    }

  const fn =  person.myBind(obj, 1, 2)
  const bibi = new fn()
  // 此时需要将person.prototype 与 bibi 串联起来
posted @ 2023-12-16 16:52  流弊的小涛  阅读(8)  评论(0编辑  收藏  举报