call,apply,bind实现

时间:2021-09-02 21:40:38   收藏:0   阅读:39

自定义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

原文:https://www.cnblogs.com/dropInInt/p/15219655.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!