手写call和apply

------------------------------------------------------------------------
手写call 
先看下call的使用,通过 call()方法可以使用另一个对象的方法
var person = {
	//sayhello: () => { console.log('hello', this.name) }
	sayhello: function() { console.log('hello', this.name) }
}
var p1 = {
	name:'tom'
}
**person.sayhello.call(p1) // hello tom**
注意:使用箭头函数不生效 因为this直接指向了全局 window(浏览器环境) 或 global(node环境) 当然如果全局存在name属性 自然也取得到该属性的值

call方法的特性
1.调用者需是函数  
2.不传参数时,指向window 
3.call方法除了接收一个对象,还可以接收参数  call(obj, params1, params2...)
4.调用函数
5.返回结果
代码如下:
// mycall方法放在Function的原型属性对象上 共用方法
Function.prototype.mycall = function(obj) {
	// 1.判断调用者是否是函数 注意 this指向调用者
	if(typeof this != 'function') throw new Error("调用者不是函数")
	// 2.如果不传参数 默认是window
	obj = obj || window
	// 保存参数 伪数组转换为真数组 
	var args = Array.from(arguments).slice(1)
	// 4.调用函数 注意this是那个函数 将那个函数变为obj的一个方法
	obj.fn = this
	var res = obj.fn(...args)
	delete obj.fn
	// 5.返回结果
	return res
}
--------------------------------------------------------------------------
手写apply
Function.prototype.myapply = function(obj) {
	if(typeof this != 'function') throw new Error('调用者不是函数')
	obj = obj || window
	obj.fn = this
	if(arguments[1]) var res = obj.fn(...arguments[1])
	else obj.fn()
	delete obj.fn
	return res
}

apply 和 call 的区别 性能哪个好
传入的参数书写方式不同 逐个传入 和 传入数组或类数组
fn.call(obj, param1, param2...)
fn.apply(obj, [param1, param2...])
call的性能更好

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值