准备

  1. // 准备函数 fun 传入两个参数
  2. function fun(param1, param2){
  3. // 输出 this,param1,param2
  4. console.log(this, param1, param2)
  5. // 返回 this 字符串
  6. return this + ''
  7. }

call

描述

  • call 用一个指定的对象来调用函数,以指定的对象作为函数的 this 指向,然后传入一个或多个函数的参数
  • 可以用它来实现继承操作

    语法

    1. function.call(thisArg, arg1, arg2, ...)

    返回值

    函数基于新传入的 this,执行后的返回值

    使用

    ```javascript fun.call(undefined, 1, 2) // 打印 Window {0: global, window: Window, self: Window, document: document, name: “”, location: Location, …} 1 2 // 返回 “[object Window]”

fun.call(null, 1, 2) // 打印 Window {0: global, window: Window, self: Window, document: document, name: “”, location: Location, …} 1 2 // 返回 “[object Window]”

fun.call(123, 1, 2) // 打印 Number {123} 1 2 // 返回 “123”

fun.call(false, 1, 2) // 打印 Boolean {false} 1 2 // 返回 “false”

fun.call(“你好”, 1, 2) // 打印 String {“你好”} 1 2 // 返回 “你好”

fun.call({a: “你好”}, 1, 2) // {a: “你好”} 1 2 // “[object Object]”

  1. <a name="hPsrj"></a>
  2. #### 模拟
  3. ```javascript
  4. // 全局 this 考虑非浏览器环境,可能不为 window
  5. const _this = this
  6. Function.prototype.MyCall = function(...params) {
  7. // 初始化 this 指向的对象
  8. let objParam = params.shift(0)
  9. // 如果是 undefined 或 null 使用全局 this
  10. if(objParam === undefined || objParam === null){
  11. objParam = _this
  12. }
  13. // 如果是基本类型,转化为对应的基本引用类型
  14. else if(typeof objParam !== 'object'){
  15. objParam = Object(objParam)
  16. }
  17. // 使用 symbol 防止对原对象中的方法覆盖
  18. const keySymbol = Symbol('key')
  19. objParam[keySymbol] = this
  20. const result = objParam[keySymbol](...params)
  21. // 删除
  22. delete objParam[keySymbol]
  23. return result
  24. }

apply

描述

  • apply() 方法,执行
  • 可以用它来实现继承操作

    语法

    1. func.apply(thisArg, [argsArray])

    返回值

    函数基于新传入的 this,执行后的返回值

    使用

    ```javascript fun.apply(undefined, [1, 2]) // 打印 Window {0: global, window: Window, self: Window, document: document, name: “”, location: Location, …} 1 2 // 返回 “[object Window]”

fun.apply(null, [1, 2]) // 打印 Window {0: global, window: Window, self: Window, document: document, name: “”, location: Location, …} 1 2 // 返回 “[object Window]”

fun.apply(123, [1, 2]) // 打印 Number {123} 1 2 // 返回 “123”

fun.apply(false, [1, 2]) // 打印 Boolean {false} 1 2 // 返回 “false”

fun.apply(“你好”, [1, 2]) // 打印 String {“你好”} 1 2 // 返回 “你好”

fun.apply({a: “你好”}, [1, 2]) // {a: “你好”} 1 2 // “[object Object]”

  1. <a name="1sjKo"></a>
  2. #### 模拟
  3. ```javascript
  4. // 全局 this 考虑非浏览器环境,可能不为 window
  5. const _this = this
  6. Function.prototype.MyApply = function(objParam, params) {
  7. // 如果是 undefined 或 null 使用全局 this
  8. if(objParam === undefined || objParam === null){
  9. objParam = _this
  10. }
  11. // 如果是基本类型,转化为对应的基本引用类型
  12. else if(typeof objParam !== 'object'){
  13. objParam = Object(objParam)
  14. }
  15. // 使用 symbol 防止对原对象中的方法覆盖
  16. const keySymbol = Symbol('key')
  17. objParam[keySymbol] = this
  18. const result = objParam[keySymbol](...params)
  19. // 删除
  20. delete objParam[keySymbol]
  21. return result
  22. }

bind

描述

  • bind() 方法创建一个新的函数,在 bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时使用。
  • 绑定函数也可以使用 new 运算符构造,它会表现为目标函数已经被构建完毕了似的。提供的 this 值会被忽略,但前置参数仍会提供给模拟函数。

    语法

    1. function.bind(thisArg[, arg1[, arg2[, ...]]])

    返回值

    返回一个原函数的拷贝,并拥有指定的 this 值和初始参数。

    使用

    ```javascript fun.bind(undefined, [1, 2])() // 打印 Window {0: global, window: Window, self: Window, document: document, name: “”, location: Location, …} 1 2 // 返回 “[object Window]”

fun.bind(null, [1, 2])() // 打印 Window {0: global, window: Window, self: Window, document: document, name: “”, location: Location, …} 1 2 // 返回 “[object Window]”

fun.bind(123, [1, 2])() // 打印 Number {123} 1 2 // 返回 “123”

fun.bind(false, [1, 2])() // 打印 Boolean {false} 1 2 // 返回 “false”

fun.bind(“你好”, [1, 2])() // 打印 String {“你好”} 1 2 // 返回 “你好”

fun.bind({a: “你好”}, [1, 2])() // {a: “你好”} 1 2 // “[object Object]”

  1. <a name="HQ4H7"></a>
  2. #### 模拟
  3. ```javascript
  4. // 全局 this 考虑非浏览器环境,可能不为 window
  5. Function.prototype.MyBind = function(...params){
  6. // 获取当前 this
  7. const currentThis = this
  8. // 获取对象
  9. let objParam = params.shift()
  10. // 创建新函数,为了处理 bind 中 new 的情况,单独使用变量存储新函数
  11. return function() {
  12. console.dir(this)
  13. // 如果是 null 或者 undefined 指向全局
  14. if(objParam === undefined || objParam === null){
  15. objParam = _this
  16. }
  17. // 如果不是对象,转化为对应的对象
  18. else if(typeof objParam !== 'object'){
  19. objParam = Object(objParam)
  20. }
  21. // 如果是 new 操作,别修改 this
  22. if(this instanceof arguments.callee){
  23. objParam = this
  24. }
  25. // 使用 symbol 防止覆盖原来的方法
  26. const keySymbol = Symbol('key')
  27. objParam[keySymbol] = currentThis
  28. const result = objParam[keySymbol](...params)
  29. delete objParam[keySymbol]
  30. return result
  31. }
  32. }