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

call,apply,bind实现

上一篇:ApplicationContextAware接口认识


下一篇:androidframework开发,30岁以后搞Android已经没有前途?看完直呼内行