这对于Polyfill for JavaScript绑定方法是否可以接受?

问题描述 投票:0回答:1

首先,我将当前传递的上下文复制到虚拟对象中。然后,我将方法fn添加为当前传递的函数。虚拟对象存在于闭包中。最后,我将返回一个函数,该函数使用初始传递的参数执行dummy.fn

Function.prototype.bind2 = function(context, ...args){
    var dummy = {...context}
    dummy.fn = this
    return function(){
        return dummy.fn(...args)
    }
}
javascript polyfills
1个回答
1
投票

不,乍看之下,有几个问题:

  • [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"
© www.soinside.com 2019 - 2024. All rights reserved.