我正在尝试这个
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!"
如何使用第一种方法使其工作?
我正在尝试这个
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!"
如何使用第一种方法使其工作?
this
在 Object 文字的上下文中不存在。您将不得不写a.a
而不是this.a
. 但是,在对象中定义的函数内部时,this
实际上是指对象本身。
这与 JavaScript 引用环境有关。
你不能。
这就是JavaScript中文字对象声明的设计方式;没有自引用将起作用
所有对的引用this
都是根据代码运行的范围解析的,window
如果您在全局范围内,则默认为。
更新
在不使用新的 getter 和 setter 语法的情况下,您可以做两件事:
构建对象但忽略具有自引用的属性;之后,附加它们。这也是你所做的。
将属性转换为函数:
var a = {
"a" : "Hey",
"b" : function() { return this.a + "!"; }
};
console.log(a.b()); // "Hey!"
小心这种方法,因为改变 的值a.a
也会影响 的输出a.b()
。
Ecmascript 第 5 版为对象引入了一些不错的附加功能:Setter 和 getter。在现代浏览器中,您可以使用getter 方法来实现您需要的结果:
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
!