首页 > 解决方案 > 使用 Function.prototype.bind 会导致原始属性丢失

问题描述

function x() { }
x.a = '1'

let y = x.bind({}) // [Function: bound x]
console.log(y.a)

函数y缺少a中定义的属性x

有什么方法可以绑定一个函数this但仍然保留它的属性a吗?

标签: javascript

解决方案


不,没有办法以您介绍的方式实现它。并了解为什么您需要了解该.bind()方法的工作原理。

我认为最好的解释可以在MDN上找到:

bind() 函数创建一个新的绑定函数,它是一个包装原始函数对象的奇异函数对象(ECMAScript 2015 中的一个术语)。调用绑定函数通常会导致其包装函数的执行。

并进一步阅读:

当调用绑定函数时,它会调用内部方法[[Call]]on [[BoundTargetFunction]],并带有以下参数Call(boundThis, ...args)。其中boundThisis [[BoundThis]], argsis [[BoundArguments]], 后跟函数调用传递的参数。

这意味着在您的示例中,该y函数是一个新函数,它在x内部包装该函数并使用更改的this上下文调用它。在我链接的 MDN 网站上创建的 polyfill 完美地解释了它。

.bind()返回另一个函数,因此它没有你给它的任何属性。


我不知道您的情况,但您的一种解决方案可能是将其x视为构造函数,如下所示:

function x() {
  this.a = '1';
}

const y = x.bind({});
const newy = new y();
console.log(newy.a);


推荐阅读