2017-10-19 15 views
0

Quelqu'un peut-il expliquer pourquoi la variable "fullName" dans mon objet ne change pas après que la méthode setter "setFirstName" a changé la variable "firstName" en "NewFirstName". Je suis conscient de la bonne réponse à ce problème, mais je suis confus quant à savoir pourquoi la solution suivante ne fonctionne pas aussi.Pourquoi la méthode setter n'a-t-elle aucun effet sur les autres variables de mon objet JavaScript?

This is a picture showing the below snippet being run

Voici le code:

<!DOCTYPE html> 
 

 
<html> 
 
<script> 
 

 
    var Person = function(firstAndLast) { 
 

 
     let firstName = firstAndLast.split(" ")[0]; 
 
     let lastName = firstAndLast.split(" ")[1]; 
 
     let fullName = firstName + " " + lastName; 
 

 
     // Getters 
 
     this.getFirstName = function() { 
 
      return firstName; 
 
     }; 
 
     this.getLastName = function() { 
 
      return lastName; 
 
     }; 
 
     this.getFullName = function() { 
 
      return fullName; 
 
     }; 
 

 
     // Setters 
 
     this.setFirstName = function(first) { 
 
      firstName = first; 
 
     }; 
 
     this.setLastName = function(last) { 
 
      lastName = last; 
 
     }; 
 
     this.setFullName = function(name) { 
 
      fullName = name; 
 
     }; 
 
    }; 
 

 
    debugger; 
 
    var bob = new Person('Bob Ross'); 
 

 
    console.log(bob.getFullName()); 
 
    bob.setFirstName("NewFirstName"); 
 
    console.log(bob.getFirstName()); 
 
    console.log(bob.getFullName()); 
 

 
</script> 
 

 
</html>

+0

Votre variable 'fullname' est évaluée une fois pendant l'instanciation. Vous voudriez retourner 'firstname + '' + lastname' du getter plutôt que' fullname' lui-même. – nilobarp

Répondre

2

Parce que vous êtes seulement le calcul fullName une fois, il ne sera pas mise à jour dynamiquement.

Vous ne voulez pas vraiment une variable pour fullName, juste un getter:

this.getFullName = function() { 
    return firstName + " " + lastName; 
} 

Supprimer

let fullName = firstName + " " + lastName; 

Sinon, vous pouvez garder votre variable et mettre à jour manuellement dans les deux setFirstName et setLastName fonctions, mais c'est vraiment le genre de choses que les acquéreurs existent pour faire.

+0

Merci pour la clarification. Puis-je demander si ce comportement est commun à travers d'autres langages de programmation orientés objet comme Java ou est-ce un caprice de JavaScript? – phao5814

+0

Ceci est commun. En Java, cela équivaudrait à définir une propriété 'fullName' dans le constructeur, cela ne va pas se mettre à jour automatiquement - vous dites" Quand vous frappez ce code, concattez ces chaînes comme elles le sont maintenant ". Un getter serait utilisé pour résoudre ce problème de la même manière que je l'ai suggéré. – UncleDave

+0

Compris - merci d'avoir répondu. – phao5814