模拟手写函数系列-bind,call,apply,new......

Function.prototype.myBind = function(context = window){
    const _this = this
    const args = [...arguments].slice(1)
    return function F(){
        if(this instanceof F){
            return new _this(...args,...arguments)
        }
        return _this.apply(context,args.concat([...arguments]))
    }
}

以上为模拟bind方法

核心思想就是将方法执行时候得this保存在另外一个变量中(此时的this一定指向一个函数,因为只有函数才能调用bind函数)

Function.prototype.myApply = function(context = window){
    context.fn = this
    let result
    if(arguments[1]){
        result = context.fn(...arguments[1])
    }else{
        result = context.fn()
    }
    delete context.fn
    return result
}

以上为模拟apply方法

核心思想是执行myApply方法的时候this一定为一个函数,假设传入的context的一个属性(fn)为这个函数,那么根据定义apply方法也就是运行了一次这个函数而已,得到结果后将context中刚刚添加得fn属性删除即可

Function.prototype.myCall = function(context = window){
    context.fn = this
    const args = [...arguments].slice(1)
    const result = context.fn(...args)
    delete context.fn
    return result
}

以上为模拟call方法

核心思想同上

function _new(){
    const Con = arguments[0]
    const args = [...arguments].slice(1)
    const obj = Object.create(Con.prototype)
    const result = Con.apply(obj,args)
    return typeof result === 'object'?result:obj
}

以上为模拟new方法

核心思想为new方法得定义

new方法实现了以下几步

创建一个新对象,继承父类原型上的属性

添加父类的属性到新的对象并且初始化,保存方法执行结果

如果执行函数有返回值切返回一个对象,则返回执行结果,否则则返回新创建的对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值