4

我正在尝试这个

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!" 

如何使用第一种方法使其工作?

4

3 回答 3

6

this在 Object 文字的上下文中不存在。您将不得不写a.a而不是this.a. 但是,在对象中定义的函数内部时,this实际上是指对象本身。

这与 JavaScript 引用环境有关。

于 2013-07-02T07:49:26.820 回答
5

你不能。

这就是JavaScript中文字对象声明的设计方式;没有自引用将起作用

所有对的引用this都是根据代码运行的范围解析的,window如果您在全局范围内,则默认为。

更新

在不使用新的 getter 和 setter 语法的情况下,您可以做两件事:

  1. 构建对象但忽略具有自引用的属性;之后,附加它们。这也是你所做的。

  2. 将属性转换为函数:

    var a = {
        "a" : "Hey",
        "b" : function() { return this.a + "!"; }
    };
    
    console.log(a.b()); // "Hey!"
    

小心这种方法,因为改变 的值a.a也会影响 的输出a.b()

于 2013-07-02T07:49:17.053 回答
2

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.afoo!

于 2013-07-02T07:59:11.990 回答