js中call和apply的实现原理           

实现call的思路:

/*
  还有就是call方法是放在Function().prototype上的也就是构造函数才有的call方法
   (我门可以查看自己的方法的原型链上的也就是
    方法名.__proto__==Function.prototype 自己定义的构造函数通过原型链可以找到原型 Function.prototype中就有call方法 )
   那我门就在Function.prototype中定义一个自己的方法实现call的功能
*/
   Function.prototype.myCall = function() {
 
    /* 先接受参数把对象和参数区分开 center:对象 arg:参数 */
    let [center, ...arg] = [...arguments]
 
    /* 重点 用传递过来的对象 添加一个属性赋值为this(这是我感觉最神奇的地方 后面通过隐式绑定) */
    center.that = this;
 
     /* 然后执行调用call这个方法的对象 */
     /* js中有谁调用的this 就指向谁->this的隐式绑定 然后接收执行的结果 */
    let result = center.that(...arg)
 
    /* 这句话 就是隐式绑定 center.that(...arg) <==>this.(...arg) 这两句话等同
    在这个函数中this指向的是调用call的这个方法 就是应为Person.call 导致this指向了 Person
    同样的方法通过 center.that让this指向了center
    这个that属性是自己为了储存调用call的对象的 在原来的对象中是没有这个属性的所有要删除这个属性
    不删除的话可以看到that中的结构式Person对象  影响继承的结构
    */
    delete center.that return result;
  }
 

实现apply的思路:

apply和call的区别是参数的传递方式不一样apply的第二个参数式一个数组

实际应用

Function.prototype.myCall = function() {
    let [center, ...arg] = [...arguments]
    center.that = this;
    let result = center.that(...arg)
    delete center.that
    return result;
}
 
  function Person() {
    this.firstname = 'Join'
    this.say = function() {
      console.log(`my name is: ${this.firstname} ~${this.listname}`)
    }
   }
 
  function Baby(name) {
    this.listname = name Person.myCall(this, this.name)
  }
 
  let a = new Baby('inter')

js中call和apply的实现原理的更多相关文章

  1. JS中 call() 与apply 方法

    1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...

  2. 区别和详解:js中call()和apply()的用法

    1.关于call()和apply()的疑点: apply和call的区别在哪里 什么情况下用apply,什么情况下用call apply的其他巧妙用法(一般在什么情况下可以使用apply) 2.语法和 ...

  3. JS中call和apply

    作用: 替换当前对象的方法中的this. 理解: call和apply是为了动态改变this出现的,当一个object没有某个方法,但是其他的有,我们可以借助call或apply用其它对象的方法来操作 ...

  4. JS中call、apply的用法说明

    JS Call()与Apply()的区别 ECMAScript规范给所有函数都定义了Call()与apply()两个方法,call与apply的第一个参数都是需要调用的函数对象,在函数体内这个参数就是 ...

  5. js中call、apply、bind那些事

    前言 回想起之前的一些面试,几乎每次都会问到一个js中关于call.apply.bind的问题,比如- 怎么利用call.apply来求一个数组中最大或者最小值 如何利用call.apply来做继承 ...

  6. js中call、apply和bind的区别

    在JS中,这三者都是用来改变函数的this对象的指向的,他们有什么样的区别呢.在说区别之前还是先总结一下三者的相似之处:1.都是用来改变函数的this对象的指向的.2.第一个参数都是this要指向的对 ...

  7. js中的call,apply,bind区别

    在JavaScript中,call.apply和bind是Function对象自带的三个方法,这三个方法的主要作用是改变函数中的this指向. call.apply.bind方法的共同点和区别:app ...

  8. JS中call和apply区别有哪些 记录

    一.call和apply区别 传递参数的方式.用法上不同,主要是参数不完全同 (1).B.Function.call(A,arg,arg) 这个例子是讲A对象“调用”B对象的Function(某个具体 ...

  9. JS 中 call 和 apply 的理解和使用

    本文受到了知乎问题 如何理解和熟练运用js中的call及apply? 的启发. obj.call(thisObj, arg1, arg2, ...); obj.apply(thisObj, [arg1 ...

随机推荐

  1. 通过html5 touch事件封装手势识别组件

    html5移动端新增了touchstart,touchmove,touchend事件,利用这3个事件,判断手指的点击和划动轨迹,我们可以封装各种手势的识别功能, 这3个事件和pc端的mousedown ...

  2. 关于Business Terminology,你需要了解的三件事

    严格意义上来说,商科论文形式的考核,主观因素会有很大的影响.这也是为什么雅思考试中,口语和写作的分数很少有出现满分的原因.除开硬性标准外(如行文逻辑,扣题准确度以及文献资料准确引用等),商科高分论文都 ...

  3. vue小练习--音乐播放器

    1 首先建一个文件夹 放几首歌曲 2 看代码 1)基本版本 <!DOCTYPE html> <html lang="zh-CN"> <head> ...

  4. centos破解压缩文件密码

    rarcrack是linux系统端的一款破解加密压缩包的工具,rarcrack使用的穷举法进行破解已经加密的rar.zip和7z压缩包,支持设置多线程,和文件类型进行破解. 1.rarcrack下载页 ...

  5. SOA--基于银行系统实例分析

    阅读以下关于 Web 系统设计的叙述 [说明] 某银行拟将以分行为主体的银行信息系统,全面整合为由总行统一管理维护的银行信息系统,实现统一的用户账户管理.转账汇款.自助缴费.理财投资.贷款管理.网上支 ...

  6. 解决RecyclerView瀑布流效果结合Glide使用时图片变形的问题

    问题描述:使用Glide加载RecyclerView的Item中的图片,RecyclerView使用了瀑布流展示图片,但是滚动时图片会不断的加载,并且大小位置都会改变,造成显示错乱. 解决方法:使用瀑 ...

  7. Windows系统自带选择文件的对话重写和居中处理

    class CMyFileDialog: public CFileDialogImpl<CMyFileDialog> { public: CMyFileDialog(BOOL bOpenF ...

  8. JS ~ Promise 对象

    Promise 对象用于表示一个异步操作的最终状态(完成或失败),以及该异步操作的结果值. Promise.all(iterable) 这个方法返回一个新的promise对象,该promise对象在i ...

  9. Day3-T1

    原题目 Describe:暴力出奇迹 [ 注意步长0.5!] code: #include<bits/stdc++.h> using namespace std; inline int r ...

  10. nsq 从搭建到应用(更新ing)windows

    1.官网下载地址 我安装的是windows nsq-1.2.0.windows-amd64.go1.12.9.tar.gz https://nsq.io/deployment/installing.h ...