手写实现call apply bind

call apply bind 区别

这三个都是Function中自带的三个方法,都是可以改变this指向的,在Function.prototype上 可以打印看一下

console.dir(Function.prototype); //你会看的这三个属性以及arguments,toString等属性

call,apply的特点

  • 如果传入的是值类型 this指向对应类型的构造函数创建的实例
  • 如果传入的是对象 this指向对象本身
  • 如果传入 undefined 或者 null this为空对象

call apply bind 用法

 let name = "张三";
    let Person = {
      name: "法外狂徒",
      age: 18,
    };
    function say(lag) {
      console.log(this);
      console.log(`my name is ${this.name},my age is ${this.age},我说${lag}`);
    }
    say("I love you"); //此时会打印Window    my name is 张三,my age is undefined,我说I love you;此时this指的是window可以获取到全局变量name
    //call
    say.call(Person , "I love you"); //my name is 法外狂徒,my age is 18,我说I love you, 此时函数中this就指向了Person
    //apply
    say.apply(Person, ["I love you"]); //my name is 法外狂徒,my age is 18,我说I love you  和call除了参数传数组外没什么不同
    //bind
    say.bind(Person, "I love you")(); //my name is 法外狂徒,my age is 18,我说I love you;bind返回的是一个函数,需要执行

实现call

在Function原型上加上自己的方法myCall;具体细节在注释

Function.prototype.myCall = function (ctx, args) {
      ctx = ctx ? Object(ctx) : window;
      args = args || [];
      const key = Symbol(); //创建一个独一无二的key以免覆盖原有属性
      ctx[key] = this; //将this赋值到传入对象ctx的某一个属性上;this指的是函数,结合上下文这里this就是say函数
      const result = ctx[key](...args); //将入参解构传入;并用result接收返回值
      delete ctx[key]; //用完后将此属性删除;不然每次call这个对象都会加个属性
      return result; //返回函数返回值
    };
    //执行myCall
    say.myCall(Person, ["I love you"]); //my name is 法外狂徒,my age is 18,我说I love you

实现apply

apply和call只是传参区别,稍微修改下即可;直接复制过来

Function.prototype.myApply = function (ctx, ...args) {
      ctx = ctx ? Object(ctx) : window;
      args = args || [];
      const key = Symbol(); //创建一个独一无二的key以免覆盖原有属性
      ctx[key] = this; //将this赋值到传入对象ctx的某一个属性上;this指的是函数,结合上下文这里this就是say函数
      const result = ctx[key](...args); //将入参解构传入;并用result接收返回值
      delete ctx[key]; //用完后将此属性删除;不然没吃call这个对象都会加个属性
      return result; //返回函数返回值
    };
 //执行myApply
    say.myApply(Person, "I love you"); //my name is 法外狂徒,my age is 18,我说I love you

实现bind

bind 是返回一个函数

Function.prototype.myBind = function (ctx, ...args) {
      ctx = ctx ? Object(ctx) : window;
      args = args || [];
      const _this =this
      return function (...rest) {
        const key = Symbol(); //创建一个独一无二的key以免覆盖原有属性
        console.log(this)//这里的this指向window,因为返回的是一个函数,this永远指向最后调用它的那个对象,最终调用这个函数的是window
        ctx[key] = _this; //将this赋值到传入对象ctx的某一个属性上;this指的是函数,结合上下文这里this就是say函数
        const result = ctx[key](...args,...rest); //将入参解构传入;并用result接收返回值
        delete ctx[key]; //用完后将此属性删除;不然没吃call这个对象都会加个属性
        return result; //返回函数返回值
      };
    };
    //执行myBind
    say.myBind(Person, "I love you 1")(); //my name is 法外狂徒,my age is 18,我说I love you
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容