2013-11-24 12 views
5

Also JavaScript ist eine funktionale Sprache, Klassen werden aus Funktionen definiert und der Funktionsumfang entspricht dem Klassenkonstruktor. Ich verstehe es jetzt, nach einer ziemlich langen Zeit zu lernen, wie man in JavaScript OOP.Self-pushing Objekt Konstruktor

Was ich tun möchte, ist nicht unbedingt möglich, also möchte ich zuerst wissen, ob das eine gute Idee ist oder nicht. Also lassen Sie uns sagen, ich habe ein Array und eine Klasse wie folgt aus:

var Entry = function(name, numbers, address) { 
    this.name = name; 
    if(typeof numbers == "string") { 
    this.numbers = []; 
    this.numbers.push(numbers); 
    } 
    else this.numbers = numbers; 
    this.address = address; 
}; 

var AddressBook = []; 

Und ich hinzufügen Kontakte mit der folgenden Funktion:

function addContact(name, numbers, address) { 
    AddressBook.push(new Entry(name, numbers, address)); 
} 

Kann ich nicht machen es so, würde new Entry()setzen selbst in AddressBook? Wenn ich dies beim Erstellen nicht tun kann, wäre es interessant, es mit einer Methode im Entry Prototyp auch zu tun. Ich konnte keinen Weg finden, etwas Ähnliches zu tun.

Antwort

7

könnten Sie versuchen, die AddressBook Array übergeben Verweis auf die Funktion wie solche:

var Entry = function(name, numbers, address, addressBook) { 
    this.name = name; 
    if(!(numbers instanceof Array)) { 
    this.numbers = [numbers]; 
    } 
    else this.numbers = numbers; 
    this.address = address; 
    addressBook.push(this); 
}; 

var addressBook = []; 

function addContact(name, numbers, address) { 
    new Entry(name, numbers, address, addressBook) 
} 
+0

Große Lösung; gibt "new Entry" ohne zugewiesenen variablen Standardcode an (d. h. funktioniert es im strikten Modus)? – gchiconi

+0

Einfacher Pass-by-Referenz. Sie haben das'Adressbuch'-Array bereits in einem äußeren Bereich definiert, übergeben es an den neuen Eintrag (dh 'ab'param), dann, nachdem Sie die Dinge im" Konstruktor "eingestellt haben, fügen Sie sich dem Array hinzu, das übergeben wurde (wieder, es ist durch Bezugnahme gegangen). – rdodev

+0

Es wäre strikt-mode-konform, wenn Sie dies innerhalb des Rumpfes einer Funktion/Klasse tun würden. Wie gerade jetzt ist AddressBook ein globales, was ein No-No ist. – rdodev

3

den Design-Ansatz überdenken. Die Hauptaufgabe des Objekts "Entry" ist Information Holder. Sie sollten die AddToAddressBook-Funktionalität in einer Art von Controller oder EventHandler kapseln.

Details Sie haben mehr als eine Verantwortung und es ist im Allgemeinen keine gute Idee, die 2 Bedenken fest zu koppeln. (z. B. Entwurfsprinzipien mit dem Prinzip der einfachen Verantwortlichkeit und der Trennung von Bedenken.)

Informationshalter - ein Objekt, das dazu bestimmt ist, bestimmte Informationen zu kennen und diese Informationen anderen Objekten zur Verfügung zu stellen.

Strukturierer - ein Objekt, das Beziehungen zwischen Objekten und Informationen über diese Beziehungen unterhält.

Ich würde vorschlagen, über SOLID Prinzipien nachzulesen und versuchen, die Verantwortlichkeiten jedes Objekts eng konzentriert zu halten. Ihr Code wird weniger komplex und einfacher zu pflegen und zu erweitern.

Auschecken - http://aspiringcraftsman.com/series/solid-javascript/
Es gibt ein Beispiel für Produkte und Warenkorb, die Ihrem Szenario oben ziemlich nah ist.

+0

+1 für das hervorragende [email protected] hat meine Frage beantwortet und mein Problem gelöst, aber deins hat einen guten Rat für mich und wer auch immer in diese Frage in der Zukunft kommt – gchiconi

Verwandte Themen