欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

手写call,apply,bind

程序员文章站 2022-03-08 09:43:21
...

为了更好的理解call,apply,bind,研究了一下怎么手写这些方法

1.手写call

    Function.prototype.Call = function (content = window) {
        content.fn = this; //this指向调用它的对象  即bar方法
        let args = [...arguments].slice(1);//取得参数列表
        let result = content.fn(...args);
        return result;
    };
    let person = {
        name: '张三'
    };

    function fn(sex, age) {
        console.log(this.name + sex + age);
    }

    fn.Call(person, '男', '18岁') // 张三男18岁

2.手写apply

    Function.prototype.Apply = function (content = window) {
        content.fn = this;
        let result;
        // 判断是否有第二个参数
        if(arguments[1]) {
            result = content.fn(...arguments[1])
        } else {
            result = content.fn()
        }
        return result
    };

3.手写apply

    Function.prototype.Bind = function (content) {
        if (typeof this != 'function') {
            throw Error('not a function')
        }
        // 若没问参数类型则从这开始写
        let fn = this;
        let args = [...arguments].slice(1);
        console.log(arguments);
        console.log(...arguments);
        let resFn = function () {
            return fn.apply(this instanceof resFn ? this : content, args.concat(...arguments))
        };
        return resFn;
    };


    this.value = 2;
    let foo = {
        value: 1
    };
    let bar = function(name, age, school) {
        console.log(name); // 'An'
        console.log(age); // 22
        console.log(school) // '家里蹲大学'
    };
    let result = bar.Bind(foo, 'An'); //预置了部分参数'An'
    result(22, '家里蹲大学') //这个参数会和预置的参数合并到一起放入bar中