2013-06-21 9 views
8

Warum dieser Code Arbeit ...Kann nicht Variable in JavaScript definieren Objektliteral

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

... aber dies nicht tut?

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

Es gibt mir "beide ist nicht definiert" Fehler. Was fehlt mir hier? Etwas stimmt nicht mit this.both? Ich bin total Neuling, wenn es darum geht, Objektliteral

+0

'Typeerror: Kann nicht lesen Eigenschaft‚text1‘von undefined' –

+0

Ist es nur mir so oder sollten beide Beispiele nicht funktionieren könnten Sie etwas Ähnliches wie schreiben – aaronman

Antwort

6

Weil im zweiten Fall this ist immer noch nicht vorhanden, wenn Sie both definieren. Wenn Sie die Methode both zur Methode machen, wie in diesem Beispiel: http://jsfiddle.net/YyWMQ/, wird es funktionieren.

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

Imho, gute Frage, +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(); 

es verstehen Sie unter

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(); 
1

ist Ihr Missverständnis in der folgenden Zeile wie angegeben versuchen:

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

Sie könnten so viel Spaß machen ction und gibt einen Wert zurück wie:

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

Und schließlich

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

Wenn greet Aufruf `diese wird die Mutter obj, Nachricht sein. Dies ist nicht der Fall, wenn Sie das Nachrichtenobjekt konstruieren.

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();