javascript - 使用 Function.prototype.bind 会导致原始属性丢失
问题描述
function x() { }
x.a = '1'
let y = x.bind({}) // [Function: bound x]
console.log(y.a)
函数y
缺少a
中定义的属性x
。
有什么方法可以绑定一个函数this
但仍然保留它的属性a
吗?
解决方案
不,没有办法以您介绍的方式实现它。并了解为什么您需要了解该.bind()
方法的工作原理。
我认为最好的解释可以在MDN上找到:
bind() 函数创建一个新的绑定函数,它是一个包装原始函数对象的奇异函数对象(ECMAScript 2015 中的一个术语)。调用绑定函数通常会导致其包装函数的执行。
并进一步阅读:
当调用绑定函数时,它会调用内部方法
[[Call]]
on[[BoundTargetFunction]]
,并带有以下参数Call(boundThis, ...args)
。其中boundThis
is[[BoundThis]]
,args
is[[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);
推荐阅读
- angular - 什么是 Angular 嵌入?
- python - 为什么进程还在后台运行?
- django - 502 bad gateway 因为权限被拒绝
- c++ - 函数不接受 X 参数,函数具有默认参数
- python-2.7 - python,lib:ImportError:没有名为 lib.options 的模块
- asp.net-core - 除非重新启动项目,否则 VS .Net Core Razor 页面不会更新
- python - 随机未定义不和谐
- python - 适用于 Raspberry Pi 4 的相机与 OpenCV 集成
- php - Laravel 多配置文件类型
- java - Selenium Java - 在脚本运行时动态更改代理