2017-08-07 1 views
3

Noob question, recherchée mais ne trouve pas de réponse à cette question. Je suis la construction d'un objet, et faisant référence aux paramètres de l'argument en utilisant le « ce » mot-clé:Javascript redondant cela dans la méthode de l'objet?

function Obj(a, b, c) { 
    this.a = a; 
    this.b = b; 
    this.c = c; 
    this.addMe = function() { 
    alert(this.a + this.b + this.c); 
    }; 
} 

Ma question est simple: si a, b, et c existent uniquement dans l'objet (en En d'autres termes, il n'y a pas de variables globales déclarées en utilisant les mêmes noms), le mot clé 'this' est-il requis lors de leur utilisation dans la méthode addMe()? la méthode non seulement être écrit comme pourrait:

this.addMe = function() { 
    alert(a + b + c); 
}; 

Quand je lance ce code en créant une nouvelle instance de Obj, il fonctionne exactement de la même façon soit. Et (ce n'est pas ce que je ferais) si je crée des variables globales pour a, b, et c de valeur différente des arguments que j'utilise lors de l'instanciation du nouvel Obj, cela n'a aucun impact sur les résultats de l'appel de méthode. Alors, est-ce qu'il me manque quelque chose qui reviendra me mordre si je n'utilise pas 'ceci' dans la méthode?

+5

Cela dépend de ce que 'a',' 'b' et c' sont, et s'il y a une chance qu'ils » sera réaffecté à un moment donné. Si les versions 'this' ne sont jamais réassignées, elles devraient être identiques. – Carcigenicate

+0

Si vous souhaitez obtenir l'état initial de l'instance à partir de la méthode, vous devez retourner le calcul par arguments. Si vous souhaitez obtenir l'état actuel d'une instance à partir de la méthode, vous devez renvoyer le calcul par propriétés d'un objet. – Teemu

+0

Comme dit '@ Carcigenicate', mais comme vous avez ces propriétés publiques, vous devez utiliser' this', car la réaffectation est une option. – PHPglue

Répondre

0

Avec la façon dont vous avez défini votre fonction addMe, oui; vous pouvez simplement fermer a, b et c et les utiliser. Cependant, le problème est que c'est généralement un moyen inutile de définir vos méthodes, car chaque instanciation d'un Obj impliquera la construction d'une nouvelle fonction addMe.

En général, les gens ont tendance à attacher des méthodes réutilisables au prototype en dehors de la fonction constructeur, soit en se basant sur la syntaxe de classe ES6 soit en faisant Obj.prototype.addMe = .... Dans les deux cas, les paramètres constructeurs a, b et c ne sont pas inclus dans la portée, vous devez donc vous fier aux propriétés disponibles dans this.

1

Si vous savez que this.a (par exemple) ne sera jamais réaffecté, alors oui, ils devraient effectivement être les mêmes. Il s'agit d'un big si cependant. Que faire si vous oubliez plus tard que vous avez l'intention de ne jamais les réaffecter? Ensuite, vous avez un bug étrange qui peut être difficile à traquer.

Exemple:

function Obj(a) { 
 
    this.a = a; 
 

 
    this.show = function() { 
 
    console.log(this.a); 
 
    console.log(a) 
 
    }; 
 
} 
 

 
var obj = new Obj(1); 
 
obj.show(); 
 

 
obj.a = 2; 
 
obj.show(); // OOPS!

Notez que le deuxième appel à show donnera deux valeurs différentes. La fonction show crée une fermeture autour de la valeur d'origine de a; essentiellement l'enregistrer. Il reste inchangé lorsque this.a est réaffecté.

Sauf si vous avez de bonnes raisons de ne pas le faire, utilisez simplement this. Déclarer explicitement vos intentions est généralement la voie à suivre en cas de doute. Vous épargner quelques coups de touches vaut rarement le mal de tête potentiel sur la route.

+0

Juste pour ajouter à cela, la raison pour laquelle cela arrive est à cause des fermetures. Lorsque la fonction 'this.show' est définie, Javascript remplace efficacement' a' par l'état de 'a' au moment de la création de la fonction (c'est-à-dire' 1'). Quand vous le changez en 2, le 'a' référencé à partir de la fonction est toujours 1. –

+0

Bon appel. Je vais voir si je peux l'adapter quelque part. – Carcigenicate

1

Pour démontrer la différence/problème de l'utilisation a + b + c

function Obj(a, b, c) { 
 
    this.a = a; 
 
    this.b = b; 
 
    this.c = c; 
 
    this.addMe = function() { 
 
    console.log('addMe', this.a + this.b + this.c); 
 
    }; 
 
    this.brokenAddMe = function() { 
 
    console.log('brokenAddMe', a + b + c); 
 
    }; 
 
} 
 
var o = new Obj(1,2,3); 
 
o.addMe(); // should be and is 6 
 
o.brokenAddMe(); // should be and is 6 
 
o.a = 4; 
 
o.addMe(); // should be and is 9 
 
o.brokenAddMe(); // should be 9 but still is 6

+0

Cela prend tout son sens. Merci d'avoir répondu. Comme je l'ai dit, noob. – TKD