手撸JS call,apply,bind

Posted apple78

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手撸JS call,apply,bind相关的知识,希望对你有一定的参考价值。

call的实现

    Function.prototype.Call=function(...args){
            var context=args[0]||window;
            var argArr=args.slice(1)
            context.fn=this;  //相当于给context加了一个fn属性,属性值为当前函数,在对象里面定义函数相当于把函数的this改为context对象了
            var result=context.fn(...argArr)
            delete context.fn
            return result;
    }
    var obj = {
        name: "hty",
        sex: "男"
    }
    function fn(age, pro) {
        console.log(`${this.name}是${this.sex}`)//hty是男
        console.log(`今年${age}职业是${pro}`)//今年24职业是前端攻城狮
    }
    fn.Call(obj, "24", "前端攻城狮")

apply的实现

    Function.prototype.Apply=function(...args){
            var context=args[0]||window;
            var argArr=args.slice(1)
            context.fn=this;
            var result=context.fn(...argArr[0])
            delete context.fn
            return result;
    }
    var obj = {
        name: "hty",
        sex: "男"
    }
    function fn(age, pro) {
        console.log(`${this.name}是${this.sex}`)//hty是男
        console.log(`今年${age}职业是${pro}`)//今年24职业是前端攻城狮
    }
    fn.Apply(obj,["24", "前端攻城狮"])

bind的实现

    Function.prototype.Bind=function(...args){
            var context=args[0]||window;
            var args=args.slice(1)
            var fbind=this;
            fBound=function(...value){   //bind要返回函数
                fbind.apply(context,args.concat(value))
            }
            return fBound
    }
    var obj = {
        name: "hty",
        sex: "男"
    }
    function fn(age, pro,type) {
        console.log(`${this.name}是${this.sex}`)//hty是男
        console.log(`今年${age}职业是${pro}他在${type}`)//今年24职业是前端攻城狮他在努力
    }
    fn.bind(obj,"24", "前端攻城狮")("努力")

 

以上是关于手撸JS call,apply,bind的主要内容,如果未能解决你的问题,请参考以下文章

奇妙JS代码系列call,apply,bind用处整理

前端随心记---------call,bind,apply

JS之call/apply/bind

js学习总结----call和apply和bind的区别

js中的call,apply,bind区别

JS中的call,apply和bind及记忆方式