2016-04-18 8 views
-1

Derzeit bin erkläre ich JS-Klassen wie in diesem nächsten Beispiel:Erstellen Sie verschiedene Instanzen der Klasse

function X(a) { 
    this.x = a; 
    X.prototype.do = function() { 
     console.log(x); 
    } 
} 

Ich mag das ‚this‘ Schlüsselwort entfernen, so dass nun meine Klassen sehen aus wie in diesem Beispiel:

function X(a) { 
    var x = a; 
    X.prototype.do = function() { 
     console.log(x); 
    } 
} 

Das funktioniert gut, wenn ich eine Instanz der X-Klasse habe. Wenn ich versuche, mehr als eine Instanz zu schaffen, sehe ich das nächste Problem:

var x1 = new X(1); 
x1.do(); // prints 1 
var x2 = new X(2); 
x2.do(); // prints 2 
x1.do(); // prints 2 instead of 1 

Das Problem mir verhindert, dass mehrere Instanzen der gleichen Klasse zu schaffen. Weiß jemand, warum dieses Problem auftritt und wie man es vermeidet?

+0

Im ersten Beispiel wird 'x' nicht deklariert. Und ändern Sie niemals den Prototyp im Konstruktor. – Oriol

Antwort

5

Du Neudefinition der prototype Durchführung des Verfahrens, was bedeutet, werden Sie es für jede Instanz der Klasse neu definiert. Und da die Methode einen geschlossenen Wert zurückgibt, gibt sie für jede Instanz der Klasse dasselbe zurück.

schreiben sie entweder als:

function X(a) { 
    this.x = a; 
} 

X.prototype.do = function() { 
    console.log(this.x); 
} 

oder:

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

nicht eine seltsame Mischung aus beidem.

+0

Großartig! Die zweite Option ist, wonach ich gesucht habe. Ich werde die Antwort in 8 Minuten akzeptieren :) – Matansh

+0

Beachten Sie, dass dies in der Regel keine großartige Idee ist, Methoden für jedes Objekt im Konstruktor neu zu definieren. Sie * sollten * die erste Methode verwenden. Nicht sicher, warum Sie "this" so sehr loswerden wollen ... – deceze

+0

Ich muss die Variablen in dieser Klasse privat machen. Haben Sie Vorschläge, wie Sie das machen können, ohne die Methoden neu zu definieren? – Matansh

Verwandte Themen