无法在JavaScript对象文字中定义变量

时间:2013-06-21 12:29:01

标签: javascript object-literal

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

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 个答案:

答案 0 :(得分:6)

因为在第二种情况下,this在定义both时仍然不存在。如果您将both转换为方法,例如此示例:http://jsfiddle.net/YyWMQ/,则可以使用。

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

Imho,好问题,+ 1

答案 1 :(得分: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();

答案 2 :(得分:1)

你的误解在以下几行:

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

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

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

最后

 greet: function() {
        console.log(this.both());
    }

答案 3 :(得分: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();