继承函数中无法访问$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
相关产品推荐
相关产品推荐

