2013-06-21 13 views
8

Perché questo codice lavoro ...Impossibile definire variabili in JavaScript letterale oggetto

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

... ma questo non lo fa?

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

Mi dà errore "entrambi non è definito". Cosa mi manca qui? C'è qualcosa che non va con this.both? Sono newbie totale quando si tratta di oggetti letterali

+0

'TypeError: Impossibile leggere la proprietà 'text1' di undefined' –

+0

Sono solo io o dovrebbe entrambi gli esempi non funziona – aaronman

risposta

6

Perché nel secondo caso this non esiste ancora quando si definisce both. se si trasformerà in metodo both, come in questo esempio: http://jsfiddle.net/YyWMQ/, funzionerà.

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

IMHO, buona domanda, +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(); 

per capirlo si può provare, come indicato di seguito

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

tuo fraintendimento è la seguente riga:

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

Si potrebbe usare come divertimento zione e restituire un valore simile:

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

E infine

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

Quando si chiama saluto, `questo sarà l'obj genitore, un messaggio. Questo non è il caso in cui stai effettivamente costruendo l'oggetto messaggio. Si potrebbe scrivere qualcosa di simile come:

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