zoukankan      html  css  js  c++  java
  • 手写bind()

    bind() 方法创建一个新的函数,在 bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时使用。
    语法: function.bind(thisArg, arg1, arg2, ...)
    从用法上看,似乎给call/apply包一层function就实现了bind():

    Function.prototype.myBind = function(thisArg, ...args) {
        return () => {
            this.apply(thisArg, args)
        }
    }
    

    但我们忽略了三点:

    bind()除了this还接收其他参数,bind()返回的函数也接收参数,这两部分的参数都要传给返回的函数
    new的优先级:如果bind绑定后的函数被new了,那么此时this指向就发生改变。此时的this就是当前函数的实例
    没有保留原函数在原型链上的属性和方法

    Function.prototype.myBind = function (thisArg, ...args) {
        if (typeof this !== "function") {
          throw TypeError("Bind must be called on a function")
        }
    
        var self = this
        // new优先级
        var fbound = function () {
            self.apply(this instanceof self ? this : thisArg, args.concat(Array.prototype.slice.call(arguments)))
        }
        // 继承原型上的属性和方法
        fbound.prototype = Object.create(self.prototype);
    
        return fbound;
    }
    
    //测试
    const obj = { name: '写代码像蔡徐抻' }
    function foo() {
        console.log(this.name)
        console.log(arguments)
    }
    
    foo.myBind(obj, 'a', 'b', 'c')()    //输出写代码像蔡徐抻 ['a', 'b', 'c']
    

    这个地方好像有没有懂的
    本文转载自:https://juejin.im/post/5e8b261ae51d4546c0382ab4

  • 相关阅读:
    <a>作Form表单提</a>
    图片读写分离
    MSSql ID自动增长删除数据重1开始
    WPF 控件
    Cookies
    MVC页面跳转
    MVC-各种传值方式
    mvc框架下,怎样用cookie实现下次自动登录
    SQL函数说明大全 (转)
    SQL日期(转)
  • 原文地址:https://www.cnblogs.com/smart-girl/p/12656821.html
Copyright © 2011-2022 走看看