zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    终于开通了
    <input>表单元素readonly时光标仍然可见
    关于字体
    SSI架构中get***方法潜在调用
    为uploads文件夹瘦身
    在JSP里使用CKEditor和CKFinder
    centos5.5上搭建svn服务器
    多文件上传
    属性化ATL,DCOM,SIM,IID
    BSTR转换成char*
  • 原文地址:https://www.cnblogs.com/dropInInt/p/15219655.html
Copyright © 2011-2022 走看看