Javascript对象属性从其他对象属性计算(动态)

JRu*_*lle 4 javascript javascript-objects

我正在尝试创建一个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));
Run Code Online (Sandbox Code Playgroud)

上面的代码目前实现了我想要的(使用标准设置值,如'a'和'b'来计算'avg',然后在第二次计算中使用'avg''四舍五入').

有没有更好的方法来实现这一点(理想情况下,eval()无论在另一个属性中引用计算属性时都没有调用).

我想要的是计算的属性像函数一样(在引用时计算它们的值)而不是最初计算它们的值而不是更改 - 我想避免使用它()来调用函数(这样我就可以参考了)简单值和计算值都是相同的 - 只是通过它们的属性名称).

Rob*_*sen 7

而不是使用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());
Run Code Online (Sandbox Code Playgroud)

如果您不必支持旧浏览器,为了避免在调用函数时使用括号,您可以使用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);
Run Code Online (Sandbox Code Playgroud)

  • 当然,但是OP说"我想避免使用()来调用函数". (2认同)

Seb*_*mon 6

如果您不需要支持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);
  }
}
Run Code Online (Sandbox Code Playgroud)

用法:

obj.a; // returns 2
obj.b; // returns 5
obj.avg; // returns 3.5
obj.rounded; // returns 3
Run Code Online (Sandbox Code Playgroud)