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
    的引用是根据作用域来解析的;在对对象进行函数调用的情况下,作用域是对象本身(假设函数显式或隐式绑定到对象)。