手写apply,call和bind

apply:

Function.prototype.myapply=function(content){
var content=content||window  //判断this对象
	content.fn=this //这个this指向的是array.push函数 
	console.log(arguments[0])//[a,b]
	console.log(arguments[1])[0,1,2]
	var result=arguments[1]?content.fn(...arguments[1]):content.fn() 
	delete content.fn
	return result
}
var array = ['a', 'b'];
var elements = [0, 1, 2];
array.push.myapply(array, elements);
console.info(array); // ["a", "b", 0, 1, 2]

在这里插入图片描述
在这里插入图片描述

call:

Function.prototype.mycall=function(){
	var content=content||window  
	content.fn=this
	console.log(content)//window
 	console.log(content.fn) // ƒ display() {console.log('sData value is %s ', this.sData);}  
 	console.log(arguments)//{ species: 'Lion', name: 'King' },  { species: 'Whale', name: 'Fail' }
	var arg=[...arguments].splice(1)
	var result=content.fn(...arg)
	delete content.fn
	return result
}

var animals = [
{ species: 'Lion', name: 'King' },
  { species: 'Whale', name: 'Fail' }
];

for (var i = 0; i < animals.length; i++) {
  (function(i) {
    this.print = function() {
      console.log('#' + i + ' ' + this.species
                  + ': ' + this.name);
    }
    this.print();
  }).mycall(animals[i], i);
}

在这里插入图片描述
bind

 Function.prototype.mybind=function(context){
            if(typeof this !=='function'){
                throw new TypeError(this+'is not function')
            }
            var that=this //保存this
            var arg=[...arguments].splice(1)
            return function F (){
                console.log(this)
                if(this instanceof F){
                    return new that(...arg,...arguments)
                }else{
                    return that.apply(context,arg.concat(...arguments))
                }
            }
        }

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值