实现思路:

ES5写法

  1. Function.prototype._call = function (context) {
  2. if (typeof this !== 'function') {
  3. console.error('type error');
  4. return false
  5. }
  6. context = context || window
  7. // 获取传入的参数
  8. let args = [...arguments].slice(1)
  9. // 将调用的函数设为对象的方法
  10. context.fn = this
  11. // 调用函数
  12. result = context.fn(...args)
  13. // 将属性删除
  14. delete context.fn
  15. return result
  16. }
  17. function fn() {
  18. this.a = arguments[0]
  19. }
  20. let obj = {
  21. name: 'zs'
  22. }
  23. fn._call(obj, 'ls')

ES6写法

  1. Function.prototype._call = function (context, ...args) {
  2. if (typeof this !== "function") {
  3. throw new TypeError('Error')
  4. }
  5. // 判断是否传入context参数,如果没有传入则设置为默认值window
  6. context = context || window
  7. // 创建一个唯一的属性
  8. const key = Symbol()
  9. // 将当前的this绑定到创建的属性上
  10. context[key] = this
  11. result = context[key](...args)
  12. delete context[key]
  13. return result
  14. }
  15. function fn() {
  16. this.a = arguments[0]
  17. }
  18. let obj = {
  19. name: 'zs'
  20. }
  21. fn._call(obj, 'ls')