
使用 Reflect.get(obj, key, receiver) 获取对象方法时,若直接调用返回的函数,this 将丢失原始对象绑定;需通过 .bind(receiver) 显式绑定上下文,确保方法内 this 指向正确实例。
使用 `reflect.get(obj, key, receiver)` 获取对象方法时,若直接调用返回的函数,`this` 将丢失原始对象绑定;需通过 `.bind(receiver)` 显式绑定上下文,确保方法内 `this` 指向正确实例。
在 JavaScript 中,函数是一等公民,其 this 绑定完全取决于调用方式,而非定义位置。当你使用 Reflect.get(obj, "create", obj) 获取 MyClass.prototype.create 方法时,Reflect.get 的第三个参数(receiver)仅影响 get 操作中 getter 的执行上下文,对普通方法本身无绑定效果——它只是安全地读取属性值,返回一个未绑定的函数引用。
因此,以下代码中:
const handler = mapHandler("create", myobj);
const res = handler(); // ❌ this === undefined(严格模式)或全局对象(非严格模式)
handler() 是以独立函数调用形式执行的,this 不再指向 myobj,导致 this.obj 报错。
✅ 正确解法是在 mapHandler 中立即绑定 this:
const mapHandler = (str, obj) => {
if (!Reflect.has(obj, str)) return null;
const candidateHandler = Reflect.get(obj, str, obj);
if (typeof candidateHandler !== "function") return null;
// 关键:返回已绑定到 obj 的新函数
return candidateHandler.bind(obj);
};
这样,handler() 调用时始终以 myobj 为 this,内部 this.obj.a 可正常访问。
⚠️ 注意事项:
-
bind()返回新函数,不可逆;后续无法通过call()或apply()覆盖该绑定(除非使用Function.prototype.call.call(fn, newThis, ...)等非常规手段,不推荐); - 若需动态
this控制(如允许调用方指定上下文),应返回未绑定函数,并由调用方显式使用handler.call(myobj)或handler.apply(myobj); - 替代方案:使用箭头函数包装(
() => obj[str]()),但会丧失原生方法的length、name等元信息,且无法被instanceof或装饰器正确识别。
总结:Reflect.get 本身不负责 this 绑定,它是纯属性读取操作。当需要“提取并复用对象方法”时,显式绑定是必要步骤——.bind(obj) 是最清晰、标准且兼容性最佳的解决方案。











