2017-03-11 6 views
1

zu verschieben Ich praktizierte tatsächlich das Erstellen von Klassen und Instanzen von ihnen mit dem new Schlüsselwort und das kam mir in den Sinn.Eine Möglichkeit, eine Instanz in eine andere Klasse in Javascript

Angenommen, ich habe eine Oberklasse namens Customers und ich habe zwei Unterklassen, die newCustomers und specialCustomers sind.

Nehmen wir an, ich einen neuen Kunden namens Bob haben ==>var bob = new newCustomer();

und ich habe einen speziellen Kunden genannt smith == >>

var smith = new specialCustomer(); 

Wie kann ich eine Methode schreiben, dass, wenn zugewiesen Bob, bewegt es ihn von einer neuen Kundeninstanz zu einer speziellen Kundeninstanz?

wie zum Beispiel, welcher Code ich schreiben soll diese Arbeit zu machen:

bob.moveToSpecial() //moves bob from being instance of newCust to specialCust 

Antwort

1

Ein Objekt keine Instanz einer Klasse ist, hat die Aufgabe, einen Prototyp auf der Basis des Konstruktor aufgerufen.

Was können Sie tun (obwohl es zu Nebenwirkungen führen kann) den Prototyp des Objekts zu ändern:

bob.__proto__ = specialCust.prototype; 

Lesen Sie über die Warnungen, wenn dies hier tun: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Object/proto

einen besseren Weg ist ein neues Objekt zu erstellen und alle Eigenschaften von bob dort bewegen:

newBob = new specialCust(); 
for(var prop in bob){ 
    newBob[prop] = bob[prop]; 
} 

beachten Sie, dass in beiden Fällen bob seine „geerbt“ Methoden und pr verliert Operationen aus dem alten Prototyp, obwohl in letzterem Fall nur die nicht aufzählbaren (wie in den Kommentaren angegeben). Die aufzählbaren werden direkt kopiert und an das neue Objekt gebunden, wobei möglicherweise geerbte Methoden außer Kraft gesetzt werden, also sei dir dessen auch bewusst.

Auch lesenswert: https://reinteractive.com/posts/235-es6-classes-and-javascript-prototypes

[Bearbeiten] Beispielcode mit Object.keys:

newBob = new specialCust(); 
Object.keys(bob).forEach(function(prop){ 
    newBob[prop] = bob[prop]; 
}); 
+0

Mit * for..in *, finden Sie auch zählbare geerbten Methoden kopieren über. ;-) Es könnte besser sein, 'Object.keys (bob) .forEach (...)' zu verwenden. – RobG

+0

Rechts. Na sicher. Ich werde die Formulierung ändern. Auch 'for..of' wäre statt' Object.keys' möglich, aber ich nehme an, dass bob keine Sammlung ist. – Psi

+0

@RobG Danke, aber bitte schreiben Sie das als Beispielcode, da mir Object.keys immer noch nicht bekannt sind. –

Verwandte Themen