你不知道的JS书籍——软绑定

Iva*_* V. 6 javascript

我目前正在阅读《你不懂 JS》。其中有一节讲的是软装订技术。基本上,它是将函数绑定到特定范围/上下文的变体。

摘自书中:

如果有一种方法可以为默认绑定提供不同的默认值(不是全局或未定义的),同时仍然让函数能够通过隐式绑定或显式绑定技术手动进行 this 绑定,那就太好了。

if (!Function.prototype.softBind) {
    Function.prototype.softBind = function(obj) {
        var fn = this,
            curried = [].slice.call( arguments, 1 ),
            bound = function bound() {
                return fn.apply(
                    (!this ||
                        (typeof window !== "undefined" &&
                            this === window) ||
                        (typeof global !== "undefined" &&
                            this === global)
                    ) ? obj : this,
                    curried.concat.apply( curried, arguments )
                );
            };
        bound.prototype = Object.create( fn.prototype );
        return bound;
    };
}
Run Code Online (Sandbox Code Playgroud)

一般来说,我了解该函数的作用,除了这部分:

bound.prototype = Object.create( fn.prototype );
Run Code Online (Sandbox Code Playgroud)

为什么我们在使用这种“软绑定”技术时必须设置原型?

Kyl*_*son 6

为什么我们在使用这种“软绑定”技术时必须设置原型?

这更多是为了完整性。如果有人尝试创建new软绑定函数的实例,他们会期望生成的对象链接[[Prototype]]到与原始函数指向的同一对象.prototype。因此,我们确保设置bound.prototype等于引用同一对象。

我认为,有人想要调用软绑定函数的可能性new很低,但为了更安全,它仍然包含在内。顺便说一句,内置的 polyfill 也是如此,bind(..)如下所示:

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind#Polyfill