2016-07-10 10 views
1
function Person(name) { 
    this.name = name; 
    return this; 
} 

var someone = new Person('someone'); 
console.log(someone.name); 

var someoneelse = Person('someoneelse'); 
console.log(someoneelse.name); 

Es ist ein gutes Muster, um Konstruktorfunktionen (Klassen) zu implementieren. Dies funktioniert sowohl mit neuen als auch ohne neue.Javascript - Klassen

[Update:] Ich denke, ich habe die Antwort, die ich suchte. Dies ohne "neu" zu verwenden, würde ein globales Objekt und eine sehr schlechte Idee zurückgeben (Dank des Kommentars von Vohuman "von Ohne das Verwenden von neu, dies im Konstruktor ist das globale Objekt keine Instanz des Konstruktors")

[ mehr Update:] tun es der richtige Weg dafür zu sorgen, neuer und ohne neue,

function Person(name) { 
    if (this instanceof Person) { 
     this.name = name; 
    } 
    else { 
     return new Person(name); 
    } 
}; 
+0

Sie könnte immer nur ES6-Klassen mit Babel oder TypeScript verwenden. – Marty

+0

check here http://stackoverflow.com/questions/1646698/what-is-the-new-keyword-in-javascript – Deep

+2

Ohne Verwendung von 'new',' this' im Konstruktor ist das globale Objekt keine Instanz der Konstrukteur. – undefined

Antwort

2

Sie nicht this verwenden, wenn Sie nicht den new Operator verwenden gehen. Stattdessen erstellen ein lokales Objekt, etwa so:

function Person(name) { 
    var obj = {} 
    obj.name = name; 
    return obj; 
} 

var someoneelse = Person('someoneelse'); 
console.log(someoneelse.name); 

Dies ist eine Fabrik-Funktion aufgerufen, und ich ziehe es new zu verwenden. Jedem jedoch sein eigenes.

Here's a good article on all of this.

+2

Die zweite Verwendung ist keine Werksfunktion; es ist kaputt. Für eine Factory-Funktion müssen Sie Ihr eigenes Objekt definieren und es zurückgeben. –

+0

Fixed meine Formulierung, @torazaburo. Danke für's Bemerken. – jmealy

+1

Im Allgemeinen verwenden Sie das [Fabrikmuster] (https://en.wikipedia.org/wiki/Factory_method_pattern), wenn es mehr als eine Kategorie von Unterklassen oder spezialisierten Eigenschaften gibt. Wo würde der Parameter verwendet werden, um die genaue Klasse anzugeben, was in diesem Fall nicht geschieht. –

0

Das Stichwort ‚neue‘ hilft, die Verschmutzung auf den globalen Namensraum zu verhindern, wenn Sie so wollen, um neue, jedes Mal nicht geben Sie das tun Sie, dass er folgenden Code haben:

function Person(name) { 
    if(this===window){ 
    return new Person(name); 
    } 
    this.name = name; 
    return this; 
} 
+2

Ich würde lieber folgendes verwenden (funktioniert auch in Knotenumgebung), Funktion Person (Vorname, Nachname) { if (diese Instanz von Person) { this.firstname = Vorname; this.lastname = Nachname; } else { Rückgabe neuer Person (Vorname, Nachname); } }; – scriptuser

Verwandte Themen