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

如何让构造函数创建的对象中依赖其他属性的属性值正确更新?

问题原因

代码中的bar是实例化阶段就完成计算的静态属性,仅在执行new foo()时会用当时传入的a、b参数运算一次并固定值,后续修改实例的a、b属性不会触发重新计算。你实例化时没有传入参数,undefined + undefined得到的NaN就被一直保存在bar属性中,修改a、b后也不会更新。

解决方案

将bar定义为getter访问器属性即可,每次访问bar时都会实时读取当前的a、b值计算结果,同时可以保证foo构造函数生成的多个实例互相独立:

function foo(a, b) {
    this.a = a;
    this.b = b;
    // 定义bar为访问器属性
    Object.defineProperty(this, 'bar', {
        get: function() {
            return this.a + this.b;
        },
        enumerable: true // 保持可枚举性,和原有属性行为一致
    });
}

var z = new foo();
z.a = 2;
z.b = 3;
console.log(z.bar); // 输出5

如果是ES6环境,也可以用类语法实现,写法更简洁:

class Foo {
    constructor(a, b) {
        this.a = a;
        this.b = b;
    }
    get bar() {
        return this.a + this.b;
    }
}

const z = new Foo();
z.a = 2;
z.b = 3;
console.log(z.bar); // 输出5

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:51:03