Javascript 如何在对象中使用exist属性
我在试这个Javascript 如何在对象中使用exist属性,javascript,Javascript,我在试这个 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!" 我怎样才能使用第一种方法使它工作?你不能 这就是JavaScript中文字的设计方式;任何自引用都不起作用 对此的所有
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!"
我怎样才能使用第一种方法使它工作?你不能
这就是JavaScript中文字的设计方式;任何自引用都不起作用
对此
的所有引用都基于代码运行的范围进行解析,如果您在全局范围内,则默认为窗口
更新
不必使用新的getter和setter语法,您可以做两件事:
var a = {
"a" : "Hey",
"b" : function() { return this.a + "!"; }
};
console.log(a.b()); // "Hey!"
使用这种方法时要小心,因为更改
a.a
的值也会影响a.b()
的输出。在对象文本的上下文中不存在此。你必须写a.a
,而不是this.a
。但是,在对象中定义的函数中,实际上是指对象本身
这与Java脚本引用环境有关。Ecmascript edition 5为对象引入了一些不错的补充:setter和getter。
在现代浏览器中,您可以使用来实现所需的结果:
var a = {
"a" : "Hey",
get b(){ return this.a + "!" },
set c(x){ this.a = x}
};
现在a.b
将为您提供正确的结果嘿代码>
c的setter函数将导致正常赋值a.c=“foo”
实际将a.a
设置为foo
无法指向构造中的对象文字。你必须改变第一种方式,就像第二种方式一样。如果这不适合您,您的具体要求是什么?欢迎使用SO!此问题以前已被问过(并已回答),请参见此
确实存在,但它不涉及对象。a
也不会,尽管在那一刻(如果你建议使用“b”:a.a+“!”
,从你的答案中还不太清楚)。事实上,自引用部分并不完全正确-如果你在对象上声明一个函数并调用它,这个
实际上会引用该对象。ES5也有二传手和传接手(就像我在回答中所说的那样)来实现这一点。@Christoph:这个回答并不否认AFAICS。它只是说,没有语法结构来引用对象文本中的现有属性。你说的是运行时行为。@Christoph是的,就像我说的,对this
的引用是根据作用域来解析的;在对对象进行函数调用的情况下,作用域是对象本身(假设函数显式或隐式绑定到对象)。