对象字面声明中的引用
有没有什么办法让下面的东西在JavaScript中工作?
var foo = {
a: 5,
b: 6,
c: this.a + this.b // Doesn't work
};
在当前的形式中,这段代码显然会引发一个引用错误,因为this
并不涉及foo
。 但是有没有办法让对象的值取决于前面声明的其他属性?
那么,我可以告诉你的唯一的事情就是获得者:
var foo = {
a: 5,
b: 6,
get c () {
return this.a + this.b;
}
};
foo.c; // 11
这是ECMAScript第5版规范引入的语法扩展,大多数现代浏览器(包括IE9)都支持该语法。
你可以做一些事情:
var foo = {
a: 5,
b: 6,
init: function() {
this.c = this.a + this.b;
return this;
}
}.init();
这将是某种对象的一次初始化。
请注意,您实际上将init()
的返回值分配给foo
,因此您必须return this
。
显然,简单的答案是缺失的,所以为了完整性:
但是有没有办法让对象的值取决于前面声明的其他属性?
不是。所有的解决方案都将其推迟到对象创建之后(以各种方式),然后分配第三个属性。 最简单的方法就是做到这一点:
var foo = {
a: 5,
b: 6
};
foo.c = foo.a + foo.b;
所有其他人只是更直接的方式来做同样的事情。 (Felix's特别聪明,但需要创建和销毁临时函数,增加复杂性;并且在对象上留下额外的属性,或者[如果您delete
该属性]影响对该对象的后续属性访问的性能。)
如果你需要它全部在一个表达式中,你可以做到这一点没有临时性质:
var foo = function(o) {
o.c = o.a + o.b;
return o;
}({a: 5, b: 6});
或者当然,如果你不止一次需要这样做:
function buildFoo(a, b) {
var o = {a: a, b: b};
o.c = o.a + o.b;
return o;
}
那么你需要使用它的地方:
var foo = buildFoo(5, 6);
链接地址: http://www.djcxy.com/p/94919.html