JS实现简单的call,apply,bind

  		var obj = {
            name: '小额',
            getName(val, val2, val3) {
                return '名字:' + this.name + ' 年龄:' + val + ' 爱好:' + val2 + ' 愿望:' + (val3 ? val3 : "暂无")
            }
        }

        var obj2 = {
            name: '夏普'
        }
        
        //call
        Function.prototype.mycall = function (obj, ...args) {
            obj = (obj !== undefined && obj !== null) ? Object(obj) : window;
            obj._fun = this;
            let res = obj._fun(...args);
            delete obj._fun;
            return res;
        }
        console.log(obj.getName.mycall(obj2, 12, '打球'))
		
		//apply和call传参方式不同
        Function.prototype.myapply = function (obj, args) {
            obj = (obj !== undefined && obj !== null) ? Object(obj) : window;
            args = args ? args : []
            obj._fun = this;
            if (!(args instanceof Array)) {
                throw new TypeError("CreateListFromArrayLike called on non-object");
            }
            let res = obj._fun(...args);
            delete obj._fun;
            return res;
        }
        console.log(obj.getName.myapply(obj2, [12, '打球']))
		
		//bind和call传参一样,但是不会立即执行,而是返回一个函数
        Function.prototype.mybind = function (obj, ...args) {
            obj = (obj !== undefined && obj !== null) ? Object(obj) : window;
            obj._fun = this;
            return function (...rest) {
                let res = obj._fun(...args, ...rest);
                delete obj._fun;
                return res;
            }
        }
        let fn = obj.getName.mybind(obj2, 12, '打球');
        console.log(fn('开心'))
        //打印
        //名字:夏普 年龄:12 爱好:打球 愿望:暂无
		//名字:夏普 年龄:12 爱好:打球 愿望:暂无
		//名字:夏普 年龄:12 爱好:打球 愿望:开心
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值