博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
call&apply&bind的js实现以及应用
阅读量:6229 次
发布时间:2019-06-21

本文共 1994 字,大约阅读时间需要 6 分钟。

js实现call

// examplelet obj = {    a: 124,    b: 'ccc'};function fn(c) {    return this.a + this.b + this.c;}// 使用call是这样转换的// step 1: 生成新的函数,新的执行上下文(通过在传入对象中增加调用方法)const obj = {    a: 124,    b: 'ccc',    fn: function(c) {        return this.a + this.b + this.c;    }}// step2: 执行 obj.fn(333);let res = obj.fn(333);// step3: obj被改变,得恢复原来的值delete obj.fn;
Function.prototype.myCall = function(context) {    const newContext = context || window;    newContext.fn = this;    const args = [];    for(let i = 1; i < arguments.length; i++) {        args.push(arguments[i]);    }    const res = newContext.fn(...args);    delete newContext.fn;    return res;}console.log(fn.myCall(obj, 'cccc'));

js实现apply

Function.prototype.myApply = function(context, arr) {    const newContext = context || window;    newContext.fn = this;    const args = [];    let res;    if (!arr) {        res = newContext.fn(...args);    }    else {        if (!(arr instanceof Array)) {            throw new Error('params must be array');        }        result = context.fn(...arr);    }    delete newContext.fn;    return res;    }console.log(fn.myApply(obj, ['cccc']));

call & apply

Math.max.apply(null, [3,5,88,2])

在这里,我们看到了一个有趣的现象,在Math.max中可以传入数组
call&apply两大作用:

改变this
借用其他对象的方法

改变this

如何实现Function.prototype.bind()

Function.prototype.bind = function(){    var self = this,        context = [].shift.apply(arguments);        args = [].slice.apply(arguments);        return function(){        return self.apply(context, [].concat.apply(args, [].slice.apply(arguments)))    };}//执行var obj = {    name: 'yyh'}var func = function(a, b, c, d){    console.log(this.name);}.bind(obj, 1, 2);func(3, 4);

借用其他对象的方法

继承的实现

var aFn = function(){    this.name = 'yyh'}var bFn = function(){    aFn.apply(this, arguments);}bFn.prototype.getName = function(){    return this.name}//执行var b = new bFn();console.log(b.getName())

能借用数组的方法,Obj.array.push, 需要满足两个条件

  • Obj的属性可存取
  • length属性可读写
var a = {c:3};[].push.apply(a, [3,4,5])console.log(a)

转载地址:http://nnxna.baihongyu.com/

你可能感兴趣的文章
你真的会玩SQL吗?无处不在的子查询
查看>>
更新SVN时提示要清理,但清理失败,乱码得解决方案
查看>>
Rich控件一
查看>>
授权对象的检查
查看>>
查询PO的预付款剩余金额
查看>>
poj 2485 -- Highways
查看>>
用python写一个抽奖程序
查看>>
npm使用入门(package.json)
查看>>
2014,微信是糖,甜到忧伤
查看>>
微信公众平台消息接口开发(12)消息接口Bug
查看>>
PHP获取毫秒时间戳,利用microtime()函数
查看>>
动态规划复习-HDU1231
查看>>
串门赛: NOIP2016模拟赛——By Marvolo 丢脸记
查看>>
Webapck项目开发基本构建及配置
查看>>
poj2562
查看>>
用matplotlib绘制图像
查看>>
flex 整理 笔记
查看>>
Cocos2d-x之瓦片地图 Tiled
查看>>
对网卡中断绑定的脚本
查看>>
Android第二次作业
查看>>