05 # 手写 bind

简介: 05 # 手写 bind

ac41ca606dfc478083af2533230e71a3.pngbind 干了什么?

  1. 改变 this 指向
  2. 没有让函数执行,返回一个改变 this 指向后的函数

bind 难点在于参数的收集

手写 bind

简单实现如下:

<script>
    Function.prototype.kaimoBind = function (content) {
        // 获取到 bind 里的剩余参数
        let bindArgs = Array.prototype.slice.call(arguments, 1);
        console.log("bindArgs----->", bindArgs);
        // 这里的 this 指向调用 kaimoBind 的 fn
        let that = this;
        function gn() {
            // 拿到 bind 返回函数的参数
            let gnArgs = Array.prototype.slice.call(arguments);
            console.log("gnArgs----->", gnArgs);
            // 改变 fn 的 this 指向
            return that.apply(content, bindArgs.concat(gnArgs));
        }
        return gn;
    };
    function fn(...args) {
        console.log("fn----this----->", this);
        console.log("fn----args----->", args);
        return args.join("");
    }
    let obj = {
        name: "kaimo313"
    };
    let res = fn.bind(obj, "k", "a", "i", "m", "o");
    console.log("res---bind-->", res(3, 1, 3));
    let res2 = fn.kaimoBind(obj, "k", "a", "i", "m", "o");
    console.log("res2---kaimoBind-->", res2(3, 1, 3));
</script>


8c2eafaaa25a4d4c91f3eeac4f981e58.png

复杂一点实现如下:

<script>
    Function.prototype.kaimoBind = function (content) {
        // 获取到 bind 里的剩余参数
        let bindArgs = Array.prototype.slice.call(arguments, 1);
        console.log("bindArgs----->", bindArgs);
        // 这里的 this 指向调用 kaimoBind 的 fn
        let that = this;
        function gn() {
            // 拿到 bind 返回函数的参数
            let gnArgs = Array.prototype.slice.call(arguments);
            console.log("gnArgs----->", gnArgs);
            // 改变 fn 的 this 指向
            return that.apply(content, bindArgs.concat(gnArgs));
        }
        function Mn() {}
        Mn.prototype = this.prototype;
        // gn 继承 Mn
        gn.prototype = new Mn();
        return gn;
    };
    function fn(...args) {
        console.log("fn----this----->", this);
        console.log("fn----args----->", args);
        return args.join("");
    }
    fn.prototype.kaimo = 313;
    let obj = {
        name: "kaimo313"
    };
    let res = fn.bind(obj, "k", "a", "i", "m", "o");
    console.log("res---bind-->", res(3, 1, 3));
    let res2 = fn.kaimoBind(obj, "k", "a", "i", "m", "o");
    console.log("res2---kaimoBind-->", res2(3, 1, 3));
    let res3 = new res2();
    console.log("res3----->", res3.kaimo);
</script>


ac41ca606dfc478083af2533230e71a3.png



目录
相关文章
|
6月前
03 # 手写 call
03 # 手写 call
37 0
|
26天前
|
Java 云计算 微服务
手写@RefreshScope,很简单嘛!
【10月更文挑战第8天】 在微服务架构和云计算时代,动态配置管理变得越来越重要。Spring Cloud提供了@RefreshScope注解,允许我们在不重启应用的情况下,动态刷新配置。但你有没有想过,这个注解是如何实现的呢?本文将带你一起手写一个简化版的@RefreshScope,一探究竟!
36 7
|
3月前
|
JavaScript 前端开发 测试技术
手写call , apply , bind 方法的实现
本文通过实例讲解了JavaScript中`call`、`apply`及`bind`方法的用途与实现。以`call`为例,展示了如何改变函数内的`this`指向,并立即执行该函数。通过在`Function.prototype`上定义`myCall`,利用`Symbol`确保新增属性的唯一性,从而避免命名冲突。接着介绍了如何处理不定数量的参数传递,最终实现了自定义的`myCall`方法。随后简述了`apply`与`call`的区别,并展示了其实现方式,主要在于参数传递形式的不同。最后,通过`bind`方法创建了一个返回新函数的例子,该新函数具有固定的`this`上下文,同时支持分批参数传递。
31 2
手写call , apply , bind 方法的实现
|
4月前
|
JavaScript
js【详解】bind()、call()、apply()( 含手写 bind,手写 call,手写 apply )
js【详解】bind()、call()、apply()( 含手写 bind,手写 call,手写 apply )
27 0
|
前端开发 Shell
前端笔记之手写bind
前端笔记之手写bind
62 0
|
6月前
|
资源调度 JavaScript 前端开发
js高级进价 - 手写bind
js高级进价 - 手写bind
|
6月前
|
前端开发 JavaScript 对象存储
【面试题】面试官为啥总是让我们手写call、apply、bind?
【面试题】面试官为啥总是让我们手写call、apply、bind?
|
6月前
|
索引
08 # 手写 filter 方法
08 # 手写 filter 方法
41 0
|
前端开发 JavaScript
面试官:你会手写bind apply 和bind吗?
面试官:你会手写bind apply 和bind吗?