2012-10-09 3 views
6

Eine Frage gespornt von Neugier, wenn ich den folgenden Code habe, was ist der Vorteil (über die Einfachheit hinaus) Aufruf einer Eigenschaft über this anstelle von user in der show_name Methode?Javascript 'this' versus Objektname

var user = { 

    name : 'John Doe', 

    show_name : function(){ 

     alert(this.name); 

     // OR 

     alert(user.name); 
    } 
}; 
+2

Beachten Sie, dass 'this' andere Nebenwirkungen haben kann:' user.show_name.call (null); ' – David

Antwort

10

Der Unterschied wird offensichtlich, wenn Sie sich dieses Beispiel ansehen. Es erstellt ein zweites Objekt und setzt den Prototyp entsprechend.

var user = { 

    name : 'John Doe', 

    show_name : function(){ 

     alert(this.name); 

     // OR 

     alert(user.name); 
    } 
}; 

user2 = Object.create(user); 
user2.name = "someone else"; 

user2.show_name(); 

bezieht sich hier this.name auf den aktuellen name Eigenschaft des Objekts, während user.name bezieht sich immer auf die ursprüngliche name Eigenschaft.

5

Durch this Verwendung stellen Sie sicher, dass nach dem Variablennamen zu ändern z.B. von user bis something funktioniert Ihr Code immer noch.

Anders als das, stelle ich mir vor, dass es (in einigen Browsern) auch eine Leistungssteigerung geben kann, da der Browser user.name im Kontext außerhalb Ihrer Funktion suchen muss, während this.name Sticks zum aktuellen Kontext verwendet werden.

+0

Wow, das ist eine ziemlich einfache Antwort. Vielen Dank. – Fluidbyte

+0

Wie stellt das Referenzieren von "this" und "user" sicher, dass wir "name" in "etwas" ändern können? Meinst du nicht, dass wir "Benutzer" zu "etwas" ändern können? –

+0

@Jacob - guter Fang - natürlich wollte ich 'user' nicht' name' schreiben. – WTK

3

Sie können dieselbe Funktion an mehreren Stellen verwenden und kontextsensitiv sein.

function foo() { 
    alert(this.name); 
} 

var a = { alert: foo, name: "A" }; 
var b = { alert: foo, name: "B" }; 
a.alert(); 
b.alert(); 
0

Wenn Sie mehrere Kopien eines Objekts zu machen sind, müssen Sie this so können Sie den aktuellen Obect verweisen. Wenn Sie den Namen verwenden, wird auf das Standardobjekt verwiesen, nicht auf die Kopie, mit der Sie arbeiten.

0

In JavaScript this bezieht sich immer auf die "owner" der Funktion, die wir ausführen, oder vielmehr auf das Objekt, für das eine Funktion eine Methode ist. Wenn wir unsere treue Funktion doSomething() auf einer Seite definieren, ist ihr Eigentümer die Seite bzw. das Fensterobjekt (oder globales Objekt) von JavaScript. Eine onclick-Eigenschaft gehört jedoch dem HTML-Element, zu dem sie gehört.

Die Verwendung von this ist aus offensichtlichen Gründen mehr als die function name empfohlen.

+0

Die Anweisung 'dies bezieht sich immer auf den" Eigentümer "der Funktion" ist falsch. Der 'this'-Wert einer Funktion wird ausschließlich durch den Aufruf der Funktion (oder durch * bind *) bestimmt und kann im strikten ES5-Modus auf ein beliebiges Objekt oder auf einen beliebigen Wert gesetzt werden. – RobG

0

this hier gibt an, dass das Objekt Teil des aktuellen Namensraum und ist im Inneren des Objekts zugänglich .. können Sie Ihre Objektnamen Änderungen user-newUser wird es keine Abhängigkeit sein annehmen und keine Kupplung Probleme entfernen ..

2

Ob Sie this oder den Funktionsnamen verwenden, hängt davon ab, wie die Funktion aufgerufen wird.

Eine this Wert der Funktion gesetzt, wie durch die Funktion aufgerufen wird oder durch bind, so dass, wenn die Funktion wird immer als ein Verfahren eines geeigneten Objekts, this verwendet aufgerufen werden. Aber wenn es anders heißen könnte, oder this sollte nur auf ein bestimmtes Objekt verweisen, verwenden Sie entweder bind oder den Objektnamen.

z.B.das OP Beispiel gegeben, betrachtet:

var x = user.showName; 
x(); 

In dem obigen wird showName genannt, ohne seine this Einstellung, so wird standardmäßig auf das globale Objekt und this.name innerhalb der Funktion wahrscheinlich nicht sein wird, was zu erwarten ist.

Das Ändern des Funktionsnamens ist kein besonders problematisches Problem, da in den Texteditoren relativ leistungsfähige Such- und Ersetzungsfunktionen verfügbar sind.

Übrigens wird diese Frage häufig gestellt. Es gibt keine "richtige" Antwort, sondern nur Ratschläge, wie man in bestimmten Fällen Entscheidungen treffen kann.