手写call

387 阅读1分钟
var obj = {
  value: 1
}

var test = {
  value: 2,
  aaa: function (num, num2) {
    console.log(this);
    console.log(this.value + '---' + num + '---' + num2)
  }
}
test.aaa.call(obj, 111, 222)	//此时的aaa中打印的this:{value: 1}
//1---111---222

//call 改变this指向 
Function.prototype.myCall = function (object) {
  var obj = object || window
  //谁调用myCall谁就是this this是一个函数
  //将函数添加到传入的obj中 也就是将函数设为对象的属性
  obj.fn = this
  //取参数 第一个参数是对象所以不取
  var args = [...arguments].slice(1)
  //调用对象中的属性 此时函数obj.fn中的this就是object
  var result = obj.fn(...args)
  delete obj.fn
  return result
}

test.aaa.myCall(obj, 111, 222)	//此时的aaa中打印的this:{value: 1, fn: ƒ}
//1---111---222