Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于Polyfill for JavaScript绑定方法,这是一个可接受的解决方案吗?_Javascript_Polyfills - Fatal编程技术网

对于Polyfill for JavaScript绑定方法,这是一个可接受的解决方案吗?

对于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作为当前传递的函数。 闭包中存在虚拟对象。 最后,我将返回一个函数,该函数使用最初传递的参数执行
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)}
仍然在参数的扩展语法上苦苦挣扎。