2010-08-03 5 views
3

Un débutant JavaScript ici. Je le code suivant:JavaScript OOPS Question

function testObject(elem) { 
    this.test = "hi"; 
    this.val = elem; 
    console.log(this.test+this.val); 
    echo(); 

    function echo() { 
     console.log(this.test+this.val); 
    } 
} 

var obj = new testObject("hello"); 

Lorsqu'il est exécuté, je me attends « hihello » à deux fois dans la émis console. Au lieu de cela, il sort comme prévu la première fois mais retourne NaN la deuxième fois.

Je suis sûr qu'il me manque quelque chose ici. Je pensais que la fonction interne peut accéder aux vars tenus à l'extérieur. Quelqu'un peut-il me guider s'il vous plaît? Je suis plus un développeur d'interface utilisateur fonctionnel et n'ai pas beaucoup d'expérience avec le code OO.

Merci!

Répondre

3

Le problème est que l'intérieur echo les points de valeur this à l'objet global, et this.test et this.val (qui font référence à window.test et window.val) sont undefined.

Vous pouvez définir la valeur this d'écho en invoquant comme:

echo.call(this); 

Cela arrive parce que vous invoquez la fonction par echo();, la valeur this est implicitement définie sur l'objet global.

Jetez un coup d'œil à this question pour savoir comment fonctionne la valeur this.

Edit: Pour pouvoir appeler juste echo(); vous persistez la valeur this du contexte de la fonction extérieure, il y a beaucoup de façons de le faire, par exemple:

//... 
var instance = this; // save the outer `this` value 
function echo(){ 
    console.log(instance.test+instance.val); // use it 
} 
echo(); 
//... 

Ou

+0

Je pense que je suis en train de l'idée. Que faire si la fonction écho prend aussi des paramètres? echo ("sometext"). call (this) ne semble pas fonctionner. –

+0

@Newbie: Vous pouvez simplement les passer après le premier argument de 'call', par ex. 'echo.call (this, 'arg1', 'arg2');' – CMS

+0

Merci, cela fonctionne mais cela signifie aussi que je vais devoir changer chacun de mes appels de fonction. De toute façon je peux modifier la déclaration de la fonction elle-même pour le faire fonctionner? Merci encore! –

2

Vous pouvez aussi le faire:

function testObject(elem) { 
    this.test = "hi"; 
    this.val = elem; 
    console.log(this.test+this.val); 

    this.echo = function() { 
     console.log(this.test+this.val); 
    } 
    this.echo(); 
} 

var obj = new testObject("hello"); 

Chaque fois que vous appelez this.echo() ou obj.echo(), this sera lié à l'objet appelant la fonction.

1

Personnellement, je trouve élégant de déclarer les méthodes de classe comme ceci:

function testObject(elem) { 
    this.test = "hi"; 
    this.val = elem; 
    this.echo(); 
} 

testObject.prototype = { 
    echo: function() { 
     console.log(this.test + this.val); 
    } 
} 

var obj = new testObject("hello");