思路:
1.首先函数都是Function函数的实例化(详情请看前面的原型三角链),
所以我们只要在Function的原型(Function.prototype)添加一个方法,模拟call,
那么所有函数都可以调用到。
2.取一个不同于call的名字方法(取名mycall)
3.正常情况下,如果想让一个方法中的this指向某个对象,最简单的方式是:某个对象.方法()
4.谁调用方法,谁就是方法里面的this,现在是say在调用mycall方法,所以mycall方法中的this就是say
Function.prototype.mycall = function(newobj) {
newobj.fn = this
newobj.fn()
delete newobj.fn
}
let obj = {
name: 'jack',
say: function() {
console.log(`我的名字是:${this.name}`)
}
}
let newobj = {
name: 'rose'
}
obj.say()
obj.say.mycall(newobj)
总结:call是方法的方法(在上面的代码中,say是方法(函数),say调用了mycall,
所以mycall是say方法的方法。call实质上就是改变了this的指向。
obj.say()中,this指向obj
obj.say.mycall(newobj)中,this指向newobj