2009-07-17 6 views
8

In Javascript OO, wann sollte ich das this Schlüsselwort verwenden?Wann dieses in Javascript OO zu verwenden?

Auch, wenn ich eine Methode einer Klasse von einer anderen Methode der gleichen Klasse aufrufen möchte, sollte ich this oder nur den Namen der Funktion verwenden? ZB ist das richtig?

function Foo() 
{ 
    this.bar= function() 
    { 
     alert('bar'); 
    } 

    this.baz= function() 
    { 
    this.bar(); //should I use this.bar() or just bar()? 
    } 
} 
+1

Sie nicht nur 'bar verwenden können()', weil 'this' niemals implizit in JavaScript ist (da es objektorientierte Sprache nicht wirklich eine richtige ist.)' Bar() 'erste aussehen würde für eine Variable, die in der Funktion 'this.baz' als 'bar' definiert ist, würde sie nach einer Variablen suchen, die in der Funktion' Foo' als 'bar' definiert ist, und schließlich würde sie im globalen Gültigkeitsbereich aussehen, und andernfalls würde sie dies tun einen Fehler werfen – Blixt

+1

Es ist wichtig, das JavaScript-Prototypsystem zu lernen, also ist es eine gute Frage zu stellen. Aber wenn ich ein großes OO-Programm in JavaScript machen würde, würde ich Joose.js oder Js.Class verwenden. – Nosredna

+0

Warum wurde das abgelehnt? –

Antwort

6

Wenn es um "objektorientierte" JavaScript geht, hier ist eine nette Anleitung Mark Dickinson hier auf SO verbunden mit: Private Members in JavaScript. Es geht ausführlich auf einige andere Dinge ein, die Sie jetzt nicht wirklich brauchen, aber wenn Sie einmal verstanden haben, wie JavaScript funktioniert, werden Sie sehen, dass es sich von Ihrer normalen objektorientierten Sprache unterscheidet, wenn es um Dinge geht, wie es wirklich ist .

würde ich sagen, dass in Ihrem Fall, Sie auf jeden Fall this verwenden sollen, aber vielleicht sollten Sie Ihre Funktionen werden in dem prototype Teil Ihrer „Klasse“ (Dies vermeidet die Funktion jedes Mal eine neue Instanz neu zu definieren erstellt wird.)

+0

Ich habe eine einfache Vorlage für Klassen erstellt, die Douglas Crawford in seinem Artikel (den ich verlinkt habe) sehr ähnlich zu sein scheint. Wenn man sich den Code anschaut, kann man sich das immer anschauen: http://blixt.org/js /classes.js (Raw-Datei) http://blixt.org/js#project/js-classes (mit Syntax-Highlight) – Blixt

+1

Was meinst du mit dem 'Prototyp-Teil der Klasse'? –

+1

Funktionen haben eine 'Prototyp'-Eigenschaft, die als Prototyp für Objekte verwendet wird, die beim Aufruf der Funktion mit dem Schlüsselwort' new' erstellt werden. Wenn Sie 'Foo.prototype.bar = function() {...};' setzen, dann haben alle Objekte, die mit 'new Foo()' erstellt wurden, eine 'bar'-Eigenschaft, die auf die 'Foo.prototype.bar'-Funktion verweist . – Blixt

0

In diesem speziellen Fall ist es am besten, eine sich selbst verweisende Variable an der Stelle von this zu verwenden Verwirrung und Kopfschmerzen innerhalb von Funktionen zu verhindern.

function Foo() 
{ 
    var self = this; 

    this.bar= function() 
    { 
     alert('bar'); 
    } 

    this.baz= function() 
    { 
    self.bar(); 
    } 
} 

Der Grund dafür ist, weil, da alles in JavaScript ein Objekt ist, das this Schlüsselwort innerhalb einer Funktion an die Funktion übergeordneten bezieht. Indem Sie eine Variable in einem bestimmten Umfang definieren, behält Ihre garantierte Variable ihren Geltungsbereich.

+0

Was sind die Gründe? –

+0

Sie tun es, damit der Umfang offensichtlich ist. Viele Menschen benutzen "das" statt "sich selbst". – Nosredna

+0

Oder Sie können $ dies tun. –

0

Nur um die vorherige Antwort von @ tj111 zu betonen und zu empathieren, empfehle ich Ihnen, this zu lesen. Um das Funktionsumfangsverständnis besser zu verstehen.

0

Die richtige Version ist diejenige, die beim Versuch, die Funktion aufzurufen, keinen Fehler meldet. Wenn Sie this weglassen, erhalten Sie eine ReferenceError Ausnahme.

Verwandte Themen