call,bind,aplly简单实现

call.js

// 先说一下三者的区别
// 共同点就是修改this指向,不同点就是
// 1.call()和apply()是立刻执行的, 而bind()是返回了一个函数
// 2.call则可以传递多个参数,第一个参数和apply一样,是用来替换的对象,后边是参数列表。
// 3.apply最多只能有两个参数——新this对象和一个数组argArray


// 一、手写实现Call
// 1.call主要都做了些什么。
// 更改this指向
// 函数立刻执行

var name = 'zs';
let obj1 = {
    name: 'ls'
};

function fn(a,b) {

    console.log(this.name + a+b);
};


Function.prototype.myCall = function (obj, ...args) {
    //最重要的一步,1、mycall内部的this是指向调用者fn函数
    //2、obj.fun就是fn函数,obj对象调用了fn函数,因此fn函数内部的this指向obj
    obj.fun = this;
    console.log(obj);
    obj.fun(...args);
    delete obj.fun;
    console.log(obj)

}
fn.myCall(obj1,'a','b');











apply.js

var name = 'zs';
let obj1 = {
    name: 'ls'
};
a=[1,23,4]


function fn(a, b) {

    console.log(this.name + a + b);
};

Function.prototype.myaplly = function (obj, array = []) {

    obj.fun = this;
    obj.fun(...array);
    delete obj.fun;
}

fn.myaplly(obj1,['1','2'])

bind.js

// 1、bind是返回一个函数
// 2、两次传参



Function.prototype.mybind = function (obj, ...args) {

    return (...args2)=>{
        obj.fn=this
        obj.fn(...args.concat(args2))
        delete  obj.fn
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值