对于Polyfill for JavaScript绑定方法,这是一个可接受的解决方案吗?
首先,我将当前传递的上下文复制到dummy中。 然后我添加了一个方法fn作为当前传递的函数。 闭包中存在虚拟对象。 最后,我将返回一个函数,该函数使用最初传递的参数执行对于Polyfill for JavaScript绑定方法,这是一个可接受的解决方案吗?,javascript,polyfills,Javascript,Polyfills,首先,我将当前传递的上下文复制到dummy中。 然后我添加了一个方法fn作为当前传递的函数。 闭包中存在虚拟对象。 最后,我将返回一个函数,该函数使用最初传递的参数执行dummy.fn Function.prototype.bind2 = function(context, ...args){ var dummy = {...context} dummy.fn = this return function(){ return dummy.fn(...arg
dummy.fn
Function.prototype.bind2 = function(context, ...args){
var dummy = {...context}
dummy.fn = this
return function(){
return dummy.fn(...args)
}
}
编辑1:在对新虚拟对象提出第一个建议后,我将其更改为以下内容
Function.prototype.bind2 = function(context, ...args){
var dummy = Object.create(context)
dummy.fn = this
return function(){
return dummy.fn(...args)
}
}
编辑2:对于排列运算符修复,我使用了eval:
Function.prototype.bind2 = function(){
var args = arguments;
var dummy = Object.create(args[0]);
dummy.fn = this;
return function(){
return eval('dummy.fn('+Object.values(args).slice(1,).join(',')+')')
}
}
不,乍一看,有几个问题:
将在传递的上下文上调用该方法,而不是它的副本-您的版本使绑定函数无法直接影响上下文bind
- 你所使用的复制对象的方法将从其原型中切割出一个对象,以及它可能具有的任何魔力
还允许函数接受未绑定的其他参数bind
- 任何需要对
进行多填充的环境都无法处理bind
扩展语法..
Function.prototype.bind2=函数(上下文,…args){
var dummy={…上下文}
dummy.fn=此
返回函数(){
返回dummy.fn(…args)
}
}
让obj=Object.create({
名称:“一个obj”,
getName:function(){返回this.name;},
setFoo:function(){this.foo=42;},
showBarBaz:function(bar,baz){console.log(bar,baz)}
});
obj.setFoo.bind2(obj)(;//不设置'obj.foo'`
控制台日志(obj);
console.log(obj.getName.bind2(obj)();//无法访问原型
对象showBarBaz.bind2(对象,“bar”)(“baz”);//不通过“baz”
obj.setFoo.bind(obj)(;//设置`obj.foo`
控制台日志(obj);
console.log(obj.getName.bind(obj)();//完全访问原型
obj.showBarBaz.bind(obj,“bar”)(“baz”);//通过“baz”
否,乍一看,有几个问题:
将在传递的上下文上调用该方法,而不是它的副本-您的版本使绑定函数无法直接影响上下文bind
- 你所使用的复制对象的方法将从其原型中切割出一个对象,以及它可能具有的任何魔力
还允许函数接受未绑定的其他参数bind
- 任何需要对
进行多填充的环境都无法处理bind
扩展语法..
Function.prototype.bind2=函数(上下文,…args){
var dummy={…上下文}
dummy.fn=此
返回函数(){
返回dummy.fn(…args)
}
}
让obj=Object.create({
名称:“一个obj”,
getName:function(){返回this.name;},
setFoo:function(){this.foo=42;},
showBarBaz:function(bar,baz){console.log(bar,baz)}
});
obj.setFoo.bind2(obj)(;//不设置'obj.foo'`
控制台日志(obj);
console.log(obj.getName.bind2(obj)();//无法访问原型
对象showBarBaz.bind2(对象,“bar”)(“baz”);//不通过“baz”
obj.setFoo.bind(obj)(;//设置`obj.foo`
控制台日志(obj);
console.log(obj.getName.bind(obj)();//完全访问原型
obj.showBarBaz.bind(obj,“bar”)(“baz”);//通过“baz”
A property polyfill:A property polyfill:A property polyfill:感谢您的提示,我通过上下文的原型创建了一个新对象,从而修复了复制对象的第一部分Function.prototype.bind2=Function(context,…args){var dummy=Object.create(context);dummy.fn=this;return Function(){return dummy.fn(…args)}
仍然在参数的扩展语法上苦苦挣扎。感谢您的提示,我通过上下文的原型创建了一个新对象,修复了复制对象的第一部分Function.prototype.bind2=Function(context,…args){var dummy=Object.create(context);dummy.fn=this;return Function(){return dummy.fn(…args)}
仍然在参数的扩展语法上苦苦挣扎。