我正在尝试这个
var a = {
"a" : "Hey",
"b" : this.a + "!"
};
console.log(a.b);
==>"undefined!"
但如果我使用它,它可以正常工作。
var a = {};
a.a = "haha";
a.b = a.a + "!";
console.log(a.b);
==>"haha!"
如何使用第一种方式使其正常工作?
答案 0 :(得分:6)
this
在Object文字的上下文中不存在。您必须写a.a
而不是this.a
。但是,在对象中定义的函数内部,this
实际上是指对象本身。
这与JavaScripts引用环境有关。
答案 1 :(得分:5)
你做不到。
这就是在JavaScript中设计文字object declaration的方式;没有自我引用会起作用
所有对this
的引用都是根据代码运行的范围解决的,如果您处于全局范围内,则默认为window
。
<强>更新强>
不使用新的getter和setter语法,你可以做两件事:
构建对象但省略具有自引用的属性;然后,追加他们。这也是你所做的。
将属性转换为函数:
var a = {
"a" : "Hey",
"b" : function() { return this.a + "!"; }
};
console.log(a.b()); // "Hey!"
请谨慎使用此方法,因为更改a.a
的值也会影响a.b()
的输出。
答案 2 :(得分:2)
Ecmascript第5版介绍了一些不错的对象:Setter和getters。 在现代浏览器中,您可以使用getter method来获得所需的结果:
var a = {
"a" : "Hey",
get b(){ return this.a + "!" },
set c(x){ this.a = x}
};
现在a.b
会为您提供正确的结果Hey!
。
c的setter函数会导致正常作业a.c = "foo"
实际将a.a
设置为foo
!