------------------------------------------------------------------------
手写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的性能更好
手写call和apply
最新推荐文章于 2022-10-26 15:05:46 发布