2016-09-19 3 views
0

Ich habe viel über Objekt-Zusammensetzung in JavaScript und die Vorteile dieses Musters über die 'Klasse' Muster gelesen. Ich habe Beispiele der Zusammensetzung gesehen, die zeigen, Object.create() zu verwenden, um neue Objekte und andere Beispiele zu erstellen, die Demonstration, die Factory-Funktionen verwendet, die Objekte zurückgeben.Factory-Funktionen vs Object.create - JavaScript - Wann zu verwenden, welche

Object.create Beispiel:

var Component = { 
    init: function() { 
    // do stuff 
    } 
}; 

var button = Object.create(Component); 

button.init(); 

Werksfunktion, Beispiel:

var ComponentFactory = function() { 
    return { 
    init: function() { 
     // do stuff 
    } 
    } 
} 

var button = ComponentFactory(); 

button.init(); 

Ich verstehe, dass Fabrik Funktionen sind ausschließlich für die Komplexität bei der Erstellung beteiligten Objekte abstrahiert weg, aber ich zu verstehen, wenn ich versuche, Es gibt einen praktischen Unterschied zwischen Object.create() und einer Funktion, die ein Objekt zurückgibt.

+0

Es ist nicht entweder oder. Sie sollten [beide zusammen] (http://stackoverflow.com/a/39546963/1048572) verwenden. – Bergi

+0

Der springende Punkt einer Factory-Funktion (oder eines Konstruktors) ist, dass Sie keine '.init()' Methode brauchen! – Bergi

Antwort

3

Werksfunktionen Objekte mit eigenen Eigenschaften erstellen, erstellt Object.create Objekte mit zugeordneten prototype.

In Ihrem Beispiel jedes Objekt erstellt von ComponentFactory seinen eigenen init hat (Verweis auf andere Stelle im Speicher), Object.create(Component) Objekten Bezug auf den gleichen Prototyp erzeugt (Component)

Object.create kostet weniger Raum/Speicher, da es erstellt keine Eigenschaften. Verwenden Sie dies für den gemeinsamen Teil von Objekten.

Factory-Funktionen sind flexibler, können Objekte mit Anfangsdaten und lokale Variablen in closures erstellen. Verwenden Sie dies für benutzerdefinierte Teile von Objekten.

1

I. Object.create

Object.create erstellen Objekt vom Prototyp in Attribute gegeben, so dass, wenn wir hasOwnProperty von Object.create erstellt auf Objekt prüfen werden wir sehen, dass es keine Eigenschaften hat (jeder in seinem Prototyp) .

So ist jedes Objekt, das von Object.create(SomeObj) erzeugt wird, mit dem gleichen Prototyp verbunden, dies hat einige Konsequenzen, zum Beispiel komplexe Objekte im Prototyp können für jede Instanz geändert werden und Änderungen sind für andere Instanzen sichtbar.

Fazit - Object.create ist etwas wie Vererbung.

Beispiel-Code zu zeigen, was ich rede:

var obj={ 
 

 
    complexProp:{ 
 
     name:"John", 
 
     surname:"Doe" 
 
    }, 
 
    hello:function(){ 
 
    
 
     console.log("Hello "+this.complexProp.name+" "+this.complexProp.surname); 
 

 
    } 
 

 
}; 
 

 
var objA=Object.create(obj); 
 
var objB=Object.create(obj); 
 

 
console.log(objA.hasOwnProperty("complexProp"));//false 
 

 
objA.complexProp.surname="Smith";//change in objA 
 

 
objB.hello();//so we see that change is also in objB

II. Factory

Das zweite Beispiel ist das Erstellen von Objekten im laufenden Betrieb, also jedes Objekt ist neue Instanz, keine Verbindung zwischen Objekten. Die zweite Lösung gibt uns auch eine Schließung, so dass wir einige private Variablen oder Funktionen erstellen können, die nur für unser Objekt sichtbar sind. Private variable Nutzung:

var ComponentFactory = function(surname) { 

    var name="John";//local variable visible for object 

    return { 
    init: function() { 
    // do stuff 
    //variable name is visible in object 
    //variable surname is also visible from object 

    } 
    } 
} 
+0

können wir verwenden Object.freeze im Object.create die Änderung in den anderen Fällen zu vermeiden .like diesen 'complexProp: Object.freeze ({name: "John", Name: "Doe"})' – zabusa

0

Wie andere erwähnt haben, können Sie mit Object.create() Objekte erstellen, die eine Beziehung haben, während Function Factories dies nicht tun. Ich würde tatsächlich argumentieren, dass Object.create eine Form der Factory-Funktion ist, nur dass die Funktion an das Erzeugen von Objekten mit denselben Eigenschaften gebunden ist. Betrachten Sie diese zwei Szenarien:

Object.create:

const Staff = { 
 
    setUp: function(name, idno){ 
 
     this.name = name; 
 
     this.idno = idno; 
 
     this.office = "Unallocated" 
 
     this.category = "Staff"; 
 
     this.accomodation = "" 
 
      
 
     } 
 
    }; 
 

 
    james = Object.create(Staff); 
 
    james.setUp("James Black", 1) 
 
    console.log(james.name) //James Black 
 
    console.log(james.idno) //1 
 

 
//Now let's assume that we want to change something about the 10,000 staff that //we recruit and sack every year. One condition is that all our staff are 20 //years old. 
 

 
we simply say*/ 
 

 
    Staff.age = 20 
 
    console.log(james.age)//20

Wie Sie sehen können, können Sie die Eigenschaft aller Mitglieder einer Gruppe, die durch einfaches Ändern des übergeordneten Objekts ändern können. Wenn Sie jedoch eine Funktionsfactory verwenden, die jedes Mal nur eindeutige Objekte erstellt, können Sie dies nicht tun.

Verwandte Themen