JavaScript中赋值操作的异常行为及原因咨询
问题原因:JavaScript对象的引用赋值特性
你遇到的不是“异常行为”,而是JavaScript中对象赋值的引用特性导致的必然结果,核心逻辑如下:
关键细节拆解
- 在
B_n的构造函数里,私有变量e是一个对象:var e={'g':'','f':new A_n()}; - 当你在
get方法里执行var result = e;时,result并不是e的副本,而是和e指向内存中同一个对象的引用。简单说,result和e是同一个对象的两个“别名”,操作其中一个,另一个也会跟着变。 - 所以执行
result.f = tmp;(tmp是100)时,本质就是直接修改了e对象的f属性——把原来的A_n实例替换成了数值100。
报错逻辑验证
- 第一次调用
a.get():此时e.f还是A_n实例,能正常调用get()拿到100,同时把e.f改成100,返回的对象自然是{g: '', f: 100}。 - 第二次调用
a.get():e.f已经变成了100(一个数值类型),再执行e.f.get()时,数值没有get方法,所以抛出TypeError。
修复方案:创建对象副本
要避免修改原对象e,需要创建e的浅拷贝,而不是直接引用。可以用以下两种方式:
// 方式1:对象展开语法 this.get=function(){ var result = {...e}; // 创建e的浅拷贝 var tmp=e.f.get(); result.f=tmp; return result; } // 方式2:Object.assign this.get=function(){ var result = Object.assign({}, e); // 创建e的浅拷贝 var tmp=e.f.get(); result.f=tmp; return result; }
这样result是一个全新的对象,修改它的f属性不会影响原对象e,多次调用get()都能正常工作。
内容的提问来源于stack exchange,提问作者Giafar the mistery dev
相关产品推荐
相关产品推荐

