You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

继承函数中无法访问$this,bind(this)绑定仍报错求助

关于对象深拷贝与this绑定的问题分析

嘿,我太懂这种卡壳的感觉了——this绑定本来就容易让人晕,再加上对象拷贝搅在一起,确实容易踩坑!咱们一步步拆解你的问题:

首先,你的深拷贝操作是对的

你用$.extend(true, {}, father, child)做深拷贝的思路完全没问题:第三个参数传空对象{},会把father和child的属性合并到这个全新对象里,不会修改原father/child,输出正常也验证了这一点,这部分不用怀疑。

为什么加了bind(this)还是出错?

核心问题出在你绑定的this到底指向谁。我猜你大概率是把方法绑定到了原对象(father/child)上,但实际调用时,你是在拷贝后的新对象上执行方法——这时候绑定的this还是指向原对象,自然会出现属性访问错误或者不符合预期的结果。

举个真实场景的例子:

// 原对象
const father = {
  name: '老父亲',
  greet: function() {
    console.log(`我是${this.name}`);
  }
};
const child = { name: '小屁孩' };

// 深拷贝得到新对象
const merged = $.extend(true, {}, father, child);

// 如果你这么绑定:绑定的是原father的this
merged.greet = merged.greet.bind(father);
merged.greet(); // 会输出「我是老父亲」,而不是预期的「我是小屁孩」

这时候正确的做法是把方法绑定到拷贝后的新对象上:

merged.greet = merged.greet.bind(merged);
merged.greet(); // 输出「我是小屁孩」,符合预期

另外两种常见的坑点

  • 箭头函数的特殊性:如果原对象的方法是箭头函数,那它的this在定义时就绑定了外层上下文(比如全局对象或者定义它的函数上下文),拷贝后也不会指向新对象——这种情况你没法通过bind改变this,只能把箭头函数改成普通函数,再重新绑定。
  • 方法被单独调用:如果你把拷贝后的对象方法赋值给变量再调用(比如const greet = merged.greet; greet()),即使没绑定原对象,this也会指向全局对象(非严格模式)或者undefined(严格模式),这时候必须提前绑定新对象。

看你说“后来我发现如果我……”,大概率是发现了要绑定新对象这个关键点吧?如果还有具体场景没说清楚,也可以补充代码片段,咱们再细化分析!

内容的提问来源于stack exchange,提问作者Marco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:57:54