JavaScript中如何获取bind方法绑定在函数上的对应目标对象
绑定函数访问绑定对象的实现方案
核心前提
原生Function.prototype.bind返回的绑定函数,其绑定的this对象存储在JS引擎内部的[[BoundThis]]私有槽中,ECMAScript标准没有提供公开访问该属性的接口,所以默认无法直接通过f.bindedObject这种方式读取。
要实现访问需求,需要在绑定阶段主动留存绑定对象,具体实现分两种场景:
场景1:同一作用域内访问绑定对象
自定义绑定方法,在生成绑定函数的同时把绑定对象挂载为函数的自定义属性即可:
// 自定义绑定工具方法,可选择挂载到Function原型或者作为独立工具 Function.prototype.bindWithMeta = function (bindTarget, ...preArgs) { const boundFunc = this.bind(bindTarget, ...preArgs); // 把绑定对象挂载到返回的函数属性上 boundFunc.bindedObject = bindTarget; return boundFunc; }; // 你的示例改造后可直接访问 let f = function(){}; class A{} f = f.bindWithMeta(new A()); console.log(f.bindedObject); // 正常输出绑定的A类实例
场景2:类方法中访问传入绑定函数的绑定对象
只要传入构造函数的绑定函数是通过上述自定义绑定方法生成的,直接读取挂载的bindedObject属性即可:
// 沿用上面的自定义bindWithMeta方法 Function.prototype.bindWithMeta = function (bindTarget, ...preArgs) { const boundFunc = this.bind(bindTarget, ...preArgs); boundFunc.bindedObject = bindTarget; return boundFunc; }; class B{ constructor(func){ this.func = func; } log(){ console.log(this.func.bindedObject); // 直接读取属性即可 } } class A{} let b = new B(function(){}.bindWithMeta(new A())); b.log(); // 输出绑定的A类实例
特殊情况说明:如果绑定函数的生成过程不受你控制(比如是第三方库生成返回的),没有通用的标准方法可以读取绑定对象,部分运行时的非标准私有接口可能可以实现,但兼容性极差,不推荐生产环境使用。
内容的提问来源于stack exchange,提问作者Weilory
相关产品推荐
相关产品推荐

