1. /**
    2. * call函数是的实现
    3. * 把调用call函数的this指向call函数中的第一个参数 然后把执行结果返回
    4. * obj2.con = obj1.con 然后返回 obj2.con()的执行结果
    5. *
    6. * @param {*} context
    7. * @param {...any} arg
    8. * @returns
    9. */
    10. Function.prototype.myCall = function(context, ...arg) {
    11. //判断参数是否有值
    12. context = context || window;
    13. arg = arg ? arg : [];
    14. // 创建一个私有方法名字
    15. const meatName = Symbol('防止重写context上的属性或方法');
    16. // call函数只能被函数调用,此处的this指向调用call的函数
    17. context[meatName] = this;
    18. // 等同于 obj2.con = obj1.con
    19. // 执行context的私有方法
    20. const result = context[meatName](arg);
    21. // 等同于 obj2.con()
    22. // 删除私有方法
    23. delete context[meatName];
    24. // 将方法结果返回
    25. return result
    26. }
    27. const obj1 = {
    28. name: 'obj1',
    29. con() {
    30. console.log(this.name);
    31. },
    32. };
    33. const obj2 = {
    34. name: 'obj2',
    35. };
    36. console.log(obj1.con.myCall(obj2));