首先,我将当前传递的上下文复制到虚拟对象中。然后,我将方法fn添加为当前传递的函数。虚拟对象存在于闭包中。最后,我将返回一个函数,该函数使用初始传递的参数执行dummy.fn
。
Function.prototype.bind2 = function(context, ...args){
var dummy = {...context}
dummy.fn = this
return function(){
return dummy.fn(...args)
}
}
不,乍看之下,有几个问题:
[bind
将在传递的上下文上调用该方法,而不是它的副本—您的版本使绑定函数无法直接影响该上下文
复制使用的对象的方法将从其原型中剪切对象,以及它可能具有的任何魔法
bind
也将允许该函数接受未绑定的其他参数
任何需要填充bind
的环境都将无法处理...
扩展语法。
Function.prototype.bind2 = function(context, ...args){
var dummy = {...context}
dummy.fn = this
return function(){
return dummy.fn(...args)
}
}
let obj = Object.create({
name: "an obj",
getName: function() { return this.name; },
setFoo: function() { this.foo = 42; },
showBarBaz: function(bar, baz) { console.log(bar, baz) }
});
obj.setFoo.bind2(obj)(); // does not set `obj.foo`
console.log(obj);
console.log(obj.getName.bind2(obj)()); // no access to prototype
obj.showBarBaz.bind2(obj, "bar")("baz") // does not pass "baz"
obj.setFoo.bind(obj)(); // sets `obj.foo`
console.log(obj);
console.log(obj.getName.bind(obj)()); // full access to prototype
obj.showBarBaz.bind(obj, "bar")("baz") // passes "baz"