在Node.js中创建包含存储值与计算值的对象
你的实现语法可行,但逻辑有明显缺陷!
咱们先拆解下你的代码:这段代码在语法上是能正常运行的,实例化后也能输出包含value、double、even的对象,但它存在一个关键问题——计算值不会跟着存储值动态更新。
举个实际测试的例子你就懂了:
var a = new test(1); console.log(a.double); // 输出2 a.value = 3; console.log(a.double); // 还是2,不会变成6!
为什么会这样?因为在构造函数里,double和even是在实例创建的那一刻就计算好的固定值,它们和value没有动态绑定的关系。一旦value被修改,这两个计算值不会自动同步更新,这肯定不是你想要的“同时包含存储值和计算值”的效果对吧?
正确的实现方式:使用Getter属性
要让计算值随存储值动态变化,你应该用getter方法来定义这些计算属性。每次访问它们时,都会基于当前的value重新计算,保证数据一致性。
方式1:ES5构造函数+Object.defineProperty
如果需要兼容旧环境,可以用这种写法:
function Test(value) { this.value = value; } // 给原型添加double的getter Object.defineProperty(Test.prototype, 'double', { get: function() { return this.value * 2; } }); // 给原型添加even的getter Object.defineProperty(Test.prototype, 'even', { get: function() { return this.value % 2 === 0; } });
方式2:ES6类语法(更简洁直观)
如果你的Node.js环境支持ES6及以上,用类的写法会更清晰易读:
class Test { constructor(value) { this.value = value; } // 定义double计算属性 get double() { return this.value * 2; } // 定义even计算属性 get even() { return this.value % 2 === 0; } }
测试一下优化后的效果:
const a = new Test(1); console.log(a.double); // 2 console.log(a.even); // false a.value = 4; console.log(a.double); // 8 console.log(a.even); // true
这样不管你什么时候修改value,double和even都会返回最新的计算结果,完美符合你的需求~
内容的提问来源于stack exchange,提问作者Dercni
相关产品推荐
相关产品推荐

