9

为什么这段代码有效...

var message = {
    texts: {
        text1: 'Hello',
        text2: 'World'
    },
    greet: function() {
        console.log(this.texts.text1 + ' ' + this.texts.text2 + '!');
    }
}
message.greet();

……但这不是吗?

var message = {
    texts: {
        text1: 'Hello',
        text2: 'World'
    },
    both: this.texts.text1 + ' ' + this.texts.text2 + '!',
    greet: function() {
        console.log(this.both);
    }
}
message.greet();

它给了我“两者都没有定义”的错误。我在这里想念什么?有什么问题this.both吗?在对象文字方面,我完全是新手

4

4 回答 4

6

因为在您定义时,第二种情况this仍然不存在both。如果您转向both方法,例如在此示例中:http: //jsfiddle.net/YyWMQ/,它将起作用。

both: function(){ return this.texts.text1 + ' ' + this.texts.text2 + '!'}  

恕我直言,好问题,+1

于 2013-06-21T12:36:06.157 回答
1

您的误解在以下行:

both: this.texts.text1 + ' ' + this.texts.text2 + '!',

您可以使用 as 函数并返回如下值:

both: function(){ return this.texts.text1 + ' ' + this.texts.text2 + '!'; } ,

最后

 greet: function() {
        console.log(this.both());
    }
于 2013-06-21T12:39:22.943 回答
1
var message = {
    texts: {
        text1: 'Hello',
        text2: 'World'
    },
    // here this refers to the scope where message is defined 
    both: this.texts.text1 + ' ' + this.texts.text2 + '!', 
    greet: function() {
        console.log(this.both);
    }
}
message.greet();

要理解它,您可以尝试如下所示

this.texts =  {
            text1: 'Alternate Hello',
            text2: 'World'
        };

var message = {
        texts: {
            text1: 'Hello',
            text2: 'World'
        },
        // here this refers to the scope where message is defined 
        both: this.texts.text1 + ' ' + this.texts.text2 + '!', 
        greet: function() {
            console.log(this.both);
        }
    }
message.greet();
于 2013-06-21T12:36:18.867 回答
1

当调用 greet 时,'this' 将是父 obj 消息。当您实际构建消息对象时,情况并非如此。你可以写类似的东西:

var Message = function () {
    this.texts = {
        text1: 'Hello',
        text2: 'Word'
    }
    this.both = this.texts.text1 + ' ' + this.texts.text2 + '!';
}

Message.prototype.greet = function () {
    console.log(this.both);
}

message = new Message();
message.greet();
于 2013-06-21T12:42:04.740 回答