Pourquoi ne puis-je pas attribuer une nouvelle valeur à "ceci" dans une fonction prototype?

Pourquoi puis-je faire ceci:

Array.prototype.foo = function() { this.splice(0, this.length); return this.concat([1,2,3]); } 

Mais je ne peux pas le faire:

 Array.prototype.foo = function() { return this = [1,2,3]; } 

Les deux fonctions détruisent la valeur de celle-ci et la changent en [1,2,3] mais la seconde jette l'erreur suivante: Uncaught ReferenceError: Invalid left-hand side in assignment

Je soupçonne que c'est parce que permettre l'affectation signifie que je pourrais éventuellement changer le tableau à autre chose (comme une chaîne), mais j'espère que quelqu'un là-bas sait à coup sûr et / ou a une explication plus détaillée.

Il n'est pas permis d'attribuer une valeur à this dans une fonction. Supposons que vous pourriez le faire, et votre code ressemblait à quelque chose comme:

 Array.prototype.foo = function() { return this = [1, 2, 3]; } var a = ["beans", "rice"]; a.foo(); // a now points to an object containing [1, 2, 3] 

Maintenant, et si vous faisiez cela:

 var a = ["beans", "rice"]; var b = a; // b refers to the same object as a b.foo(); // what does b refer to now? how about a? 

L'acte d'appeler une fonction .foo() sur un objet ne doit pas changer l' identité de l'objet. Ce serait très déroutant pour l'appelant si b tout à l'heure a commencé à se référer à un objet différent d' a simplement parce qu'une méthode était appelée.

Vous confondez les objets avec des références.

Un tableau est un objet, lorsque vous utilisez un littéral comme [1,2,3] vous créez un nouveau tableau.

Un nom de variable comme this ou a est une référence à un objet. Si cela vous aide, imaginez un objet en tant que personne et la référence comme nom d'utilisateur. Vous pouvez avoir plus d'une référence au même objet, par exemple:

 var a = [1,2]; var b = a; b.push(3); alert(a.length); // Gives "3" 

Imaginez si vous aviez un ami nommé Sarah. Vous l'appelez aussi parfois "Ace". Si Sarah obtient une coupe de cheveux un jour, Ace a une coupe de cheveux aussi, car "Sarah" et "Ace" sont tous deux des noms différents pour la même personne.

Si vous utilisez une méthode de matrice a.push comme a.push ou a.splice ( concat n'est cependant pas un!), Vous modifiez l'objet Array existant, et a se réfère toujours au même objet. C'est comme se faire couper les cheveux – vous pouvez sembler différent, mais vous êtes toujours la même personne.

Lorsque vous attribuez une référence à une nouvelle valeur, avec a = [1,2,3] , vous créez un nouveau tableau et modifiez a pour le faire référence. C'est comme trouver un nouvel ami avec des cheveux différents, et décider d'appeler son Ace à la place.

Maintenant, c'est un nom spécial généré par Javascript. Ce n'est pas un prénom comme Sarah, mais plus d'un titre, comme «mère». Votre mère peut avoir une nouvelle coupe de cheveux, mais vous ne pouvez pas obtenir une nouvelle mère. De même, vous ne pouvez pas modifier ce que this fait référence à l'intérieur d'une fonction.

Vous n'êtes pas autorisé à réaffecter this . Parce que la valeur associée à un contexte d'exécution est immuable.

Est-il possible de modifier la valeur de this ? Pas par assignation, vous ne pouvez pas attribuer de valeur à this

Ton cas:

 Array.prototype.foo = function() { this.splice(0, this.length); return this.concat([1,2,3]); } 

Mais je ne peux pas le faire:

 Array.prototype.foo = function() { return this = [1,2,3]; } 

Lorsque vous modifiez la méthode d'ajout de prototype foo() , la première partie rend le tableau vide, équivaut à réaffecter son instance.

Par exemple, var a = []

Ensuite, dans la valeur de retour:

 return this.concat([1,2,3]); 

Rappelez-vous que concat ne détruit pas un tableau, il crée un nouveau tableau et le renvoie

Étant donné a = ['x'] et b = ['y'] , c = a.concat(b) aboutit à c = ['x','y'] , et a et b restent les mêmes qu'ils étaient

Maintenant, vous le faites dans le tableau

 a=['a','b','c'] 

Alors vous appelez a.foo(); , À l'intérieur d' a volonté sera égal a=[] , avec this.splice(0, this.length); Puis concatène [ ] avec [1,2,3]

Donc, si je dis juste a.foo() , en fait, rien ne se passe à l'extérieur si je n'attribue pas le résultat à quelque chose, juste un reste vide.

Si a est affecté à quelque chose

 c = a.foo() 

Alors c sera [1,2,3] , et a encore vide [ ]

Dans la deuxième partie, this = [1,2,3]

Il est possible de modifier la valeur de ceci?, Pas par assignation, vous ne pouvez pas assigner une valeur à cette