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

JavaScript中赋值操作的异常行为及原因咨询

问题原因:JavaScript对象的引用赋值特性

你遇到的不是“异常行为”,而是JavaScript中对象赋值的引用特性导致的必然结果,核心逻辑如下:

关键细节拆解

  1. 在B_n的构造函数里,私有变量e是一个对象:
    var e={'g':'','f':new A_n()};
    
  2. 当你在get方法里执行var result = e;时,result并不是e的副本,而是和e指向内存中同一个对象的引用。简单说,result和e是同一个对象的两个“别名”,操作其中一个,另一个也会跟着变。
  3. 所以执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 10:12:53