Javascript 根据其他对象属性计算(即时)的对象属性
Javascript Object Properties Calculated (on the fly) from Other Object Properties
我正在尝试创建一个 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' 'rounded').
有没有更好的方法来实现这一点(理想情况下,只要计算出的 属性 在另一个 属性 中被引用,就不需要 eval()
调用)。
我希望计算出的属性像函数一样运行(只要引用它们就计算它们的值)而不是一开始就计算它们的值并且不改变 - 我想避免必须使用 ()
调用函数(以便我可以以相同的方式引用普通值和计算值 - 仅通过它们的 属性 名称)。
您似乎在追求所谓的 计算 属性。这是一个在被要求时计算的变量。在 Javascript 中,您可以使用 Object Getter/Setter Syntax
如果您不需要支持 Internet Explorer 8 或更低版本,请使用 Getters:
var obj = {
a:2,
b:5,
get avg(){
return (this.a + this.b)/2;
},
get rounded(){
return Math.floor(this.avg);
}
}
用法:
obj.a; // returns 2
obj.b; // returns 5
obj.avg; // returns 3.5
obj.rounded; // returns 3
不使用 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);
我正在尝试创建一个 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' 'rounded').
有没有更好的方法来实现这一点(理想情况下,只要计算出的 属性 在另一个 属性 中被引用,就不需要 eval()
调用)。
我希望计算出的属性像函数一样运行(只要引用它们就计算它们的值)而不是一开始就计算它们的值并且不改变 - 我想避免必须使用 ()
调用函数(以便我可以以相同的方式引用普通值和计算值 - 仅通过它们的 属性 名称)。
您似乎在追求所谓的 计算 属性。这是一个在被要求时计算的变量。在 Javascript 中,您可以使用 Object Getter/Setter Syntax
如果您不需要支持 Internet Explorer 8 或更低版本,请使用 Getters:
var obj = {
a:2,
b:5,
get avg(){
return (this.a + this.b)/2;
},
get rounded(){
return Math.floor(this.avg);
}
}
用法:
obj.a; // returns 2
obj.b; // returns 5
obj.avg; // returns 3.5
obj.rounded; // returns 3
不使用 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);