5

Ich versuche, ein JavaScript-Objekt zu erhalten, die "diese" Zuordnungen des Konstruktors eines anderen Objekts zu verwenden, sowie den Prototyp dieses Objekts anzunehmen Funktionen. Hier ist ein Beispiel dafür, was ich zu erreichen bin versucht:Javascript-Funktion mit "this =" gibt "ungültige linke Seite in Zuweisung"

/* The base - contains assignments to 'this', and prototype functions 
    */ 
function ObjX(a,b) { 
    this.$a = a; 
    this.$b = b; 
} 

ObjX.prototype.getB() { 
    return this.$b; 
} 

function ObjY(a,b,c) { 
    // here's what I'm thinking should work: 
    this = ObjX(a, b * 12); 
    /* and by 'work' I mean ObjY should have the following properties: 
    * ObjY.$a == a, ObjY.$b == b * 12, 
    * and ObjY.getB == ObjX.prototype.getB 
    * ... unfortunately I get the error: 
    *  Uncaught ReferenceError: Invalid left-hand side in assignment 
    */ 

    this.$c = c; // just to further distinguish ObjY from ObjX. 
} 

Ich wäre dankbar für Ihre Gedanken darüber, wie haben ObjY ObjX die Zuweisungen zu ‚this‘ subsumieren (dh nicht alle this.$* = * Zuweisungen wiederholen müssen in ObjYs Konstruktor) und haben ObjY den ObjX.prototype angenommen.

Mein erster Gedanke ist folgendes zu versuchen:

function ObjY(a,b,c) { 
    this.prototype = new ObjX(a,b*12); 
} 

Im Idealfall möchte ich lernen, wie man dies in einer prototypischen Art und Weise zu tun (dh müssen keine dieser ‚klassischen‘ OOP Ersatz verwenden wie Base2).

Es kann bemerkenswert sein, dass ObjY anonym sein wird (z. B. factory['ObjX'] = function(a,b,c) { this = ObjX(a,b*12); ... }) - wenn ich die Terminologie richtig habe.

Vielen Dank.

+1

bezogen werden: [? Warum kann ich einen neuen Wert „this“ in einer Prototyp-Funktion zuweisen] (http: // stackoverflow.com/q/9713323/1048572) – Bergi

Antwort

15

Man kann nicht wirklich das tun, weil der this Wert per Definition unveränderlich, können Sie nicht auf diese Art und Weise ändern, was es verweist.

Eine Abhilfe wäre die call oder apply Methoden zu benutzen, um Ihre ObjX Konstruktorfunktion im this Objekt von ObjY auszuführen:

function ObjY(a,b,c) { 
    ObjX.call(this, a, b * 12); 
    this.$c = c; 
} 

Im obigen Beispiel wird die ObjX Funktion ausgeführt wird seinen this Wert ändert, Daher werden alle Eigenschaftserweiterungen, die Sie an diesem Objekt in dieser Funktion vornehmen, in dem neuen Objekt widergespiegelt, auf das sich der this Wert im ObjY Konstruktor bezieht.

Sobald die call Methode endet, wird das this Objekt erweitert und Sie können weitere Eigenschaftenerweiterungen vornehmen, wie z. B. Ihren $c Wert hinzufügen.

Edit: über die Prototypen, wird Ihre Probe nicht funktionieren, weil die prototype Eigenschaft keine besondere Bedeutung für das Objekt in Positionen hat sie wie jede andere Eigenschaft sein wird, soll es auf Konstruktorfunktionen verwendet werden.

Ich denke, Sie könnten die prototype Eigenschaft von Konstruktoren mit der internen [[Prototype]] Eigenschaft, die alle Objekte haben, verwirren.

Die [[Prototype]] Eigenschaft kann nur durch den new Operator (durch den [[Construct]] internen Betrieb), ist diese Eigenschaft nicht eingestellt werden kann, geändert werden (obwohl einige Implementierungen, wie die Mozilla, können Sie es durch obj.__proto__; zugreifen können, und in ECMAScript 5, die Object.getPrototypeOf Methode wurde eingeführt, aber ich würde dir nicht empfehlen, direkt damit zu verfahren).

Eigentlich, wenn der Konstruktor-Funktion ausgeführt wird, die interne [[Prototype]] Eigenschaft des Objekts, dass der this Wert bezieht, hat bereits seinen Konstruktor prototype Eigenschaft festgelegt worden.

So, wie @Anurag Kommentare, könnten Sie die ObjY.prototype zu einem neu erstellten ObjX Objekt festgelegt:

function ObjY(a,b,c) { 
    ObjX.call(this, a, b * 12); 
    this.$c = c; 
} 

ObjY.prototype = new ObjX(); 
ObjY.prototype.constructor = ObjY; 

Das, dass Ihre ObjY erben macht auch die Objekte, die die ObjX.prototype hinzugefügt, und wie Sie sehen, Ich habe die ObjY.prototype.constructor geändert, da die Zuweisung in der obigen Zeile dazu führt, dass diese Eigenschaft falsch auf ObjX zeigt.

Empfohlene Artikel:

+1

Danke CMS. Große Verbindung auch. Die andere Frage ist, wie man die Prototypen zuweist - kann das aus dem Konstruktor heraus geschehen? –

+0

@Brian, gern geschehen, ja ich hatte einen Tippfehler! – CMS

+0

@Brian, setze ein Objekt von ObjX als Prototyp für ObjY, um auch seine Methoden zu erhalten. 'ObjY.prototype = new ObjX;'. Methoden und Eigenschaften, falls nicht im aktuellen Objekt gefunden, werden in der Prototypkette nachgeschlagen. – Anurag

Verwandte Themen