call改变this指向的思考
var age = 13;
function test(){
console.log(this.age); //13
}
test()
var myobj = {
age: 22
}
test.call(myobj) //22
思考一
test函数为什么可以调用call方法?
test是构造函数对象,所以是函数也是对象
test没有call方法,那么就顺着原型链网上查找,发现
test._proto_ = Function.prototyp
而Function.prototyp有call方法,于是调用call方法
- call方法是如何来改变this指向的 ?实现一个call方法,即可明白
Function.prototype.myCall = function(obj){
obj.fn = this
var newArgs = []
// 将获取到的参数放进newArgs
for(var i = 1; len = arguments.length, i < len; i++){
newArgs.push(args[i])
}
obj.fn(...newArgs)
delete obj.fn // 使用完以后,删除添加的属性
}
var age = 13;
function test(){
console.log(this.age); //13
}
test()
var myobj = {
age: 22
}
test.myCall(myobj) // 22