call,apply,bind实现

自定义call方法

Function.prototype.myCall = function (context) {
    if (typeof this !== 'function'){
        throw new TypeError(`${context} is not a function`)
    }
    context = context || window
    context.fn = this
    let args = [...arguments].slice(1)
    let myfn = context.fn(args)
    delete context.fn
    return myfn
}

自定义apply方法

Function.prototype.myApply = function (context) {
    if (typeof this !== 'function'){
        throw new TypeError(`${context} is not a function`)
    }
    context = context || window
    context.fn = this
    let myfn
    if (arguments[1]) {
        myfn = context.fn(...arguments[1])
    } else {
        myfn = context.fn()
    }
    delete context.fn
    return myfn
}

自定义bind方法

Function.prototype.myBind = function (context) {
    if (typeof this !== 'function'){
        throw new TypeError(`${context} is not a function`)
    }
    const _this = this
    const args = [...arguments].slice(1)
    return function myFn () {
        if (this instanceof myFn) {
            return new _this(...args, ...arguments)
        }
        return _this.apply(context, args.concat(...arguments))
    }
}

参考:

https://juejin.cn/post/6844903764999012366#heading-2

posted @ 2021-09-02 17:08  dropInInt  阅读(30)  评论(0编辑  收藏  举报