我正在尝试创建一个 javascript 对象来计算其上设置的属性的各种值。我已经编译了这个简单的例子来说明我想要实现的目标:JSFIDDLE
var obj = {};
obj.a = 2;
obj.b = 5;
obj.avg = "(obj.a + obj.b)/2";
obj.rounded = "Math.floor(eval(obj.avg))";
console.log("rounded avg: " + eval(obj.rounded));
//simulate changing properties
obj.a = Math.floor(Math.random() * 10);
obj.b = Math.floor(Math.random() * 10);
console.log("rounded avg: " + eval(obj.rounded));
上面的代码目前实现了我想要的(使用“a”和“b”等标准设置值来计算“avg”,然后在第二次计算“四舍五入”中使用“avg”)。
有没有更好的方法来实现这一目标(理想情况下没有eval()
每当计算属性在另一个属性中引用时调用)。
我希望计算的属性像函数一样工作(每当引用它们时计算它们的值),而不是最初计算它们的值并且不改变 - 我想避免使用()
调用函数(这样我就可以以相同的方式引用普通值和计算值 - 只需通过它们的属性名称)。
而不是使用eval
,使用函数如下:
var obj = {};
obj.a = 2;
obj.b = 5;
obj.avg = function() { return (this.a + this.b) / 2; };
obj.rounded = function() { return Math.floor(this.avg()); };
console.log("rounded avg: " + obj.rounded());
obj.a = Math.floor(Math.random() * 10);
obj.b = Math.floor(Math.random() * 10);
console.log("rounded avg: " + obj.rounded());
如果您不必支持旧浏览器,为了避免在调用函数时必须使用括号,您可以使用getters如下:
var obj = {
a: 2,
b: 5,
get avg() { return (this.a + this.b) / 2; },
get rounded() { return Math.floor(this.avg) }
}
console.log("rounded avg: " + obj.rounded);
obj.a = Math.floor(Math.random() * 10);
obj.b = Math.floor(Math.random() * 10);
console.log("rounded avg: " + obj.rounded);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)