JS call applay bind 实现

call方法实现

    const name = "Marry";
    function myCall() {
        const arr = Array.from(arguments);
        const obj = arr.splice(0,1)[0];
        const sym = Symbol('a');
        obj[sym] = this;
        obj[sym](...arr);
        delete obj[sym];
    }

    let obj = {name: 'jack'};
    function per() {
        console.log(this.name)
    }
    Function.prototype.myCall = myCall;
    per(); // Marry
    per.myCall(obj); // Jack
    per.call(obj); // jack
    console.log(obj);

apply实现

 function myApply() {
        const arr = Array.from(arguments);
        if (arr[1] && !Array.isArray(arr[i])) {
            return new TypeError("The second argument must be an array");
        }
        const obj = arr[0] || window;
        const agu = arr[1] || [];
        obj.fn = this;
        obj.fn(agu);
        delete obj.fn
    }
    Function.prototype.myApply = myApply;

    const obj = {age: 100};
    window.age = 200;

    function A() {
        console.log(this.age)
    }
    A(); // 200
    A.myApply(obj) // 100

bind实现(bind有返回)

function myBind() {
         let arr = Array.from(arguments);
         const obj = arr.splice(0,1)[0] || window;
         const sym = Symbol("a");
         obj[sym] = this;
         console.log(obj);
         return function () {
             obj[sym](...arr);
         }
    }
    Function.prototype.myBind = myBind;
    const obj = {name: "jack"};
    const name = "Marry";
    function B() {
        console.log(this.name);
    }
    const bind = B.myBind(obj);
    B(); // Marry
    bind(); // Jack
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值