我目前正在阅读《你不懂 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)
为什么我们在使用这种“软绑定”技术时必须设置原型?
为什么我们在使用这种“软绑定”技术时必须设置原型?
这更多是为了完整性。如果有人尝试创建new软绑定函数的实例,他们会期望生成的对象链接[[Prototype]]到与原始函数指向的同一对象.prototype。因此,我们确保设置bound.prototype等于引用同一对象。
我认为,有人想要调用软绑定函数的可能性new很低,但为了更安全,它仍然包含在内。顺便说一句,内置的 polyfill 也是如此,bind(..)如下所示:
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind#Polyfill