2016-05-23 13 views
-1

Hallo Im Beispiel unten I MeasurementObject am Import verwendet: import MeasurementObject from './app/..etc'Dieses Schlüsselwort für Objektliteral

Wenn ich eine Instanz von MeasurementObject.getScrollToValue() -Aufruf

Die this innerhalb der Methode MeasurementObject.getScrollToValue() zum Ausführen Zusammenhang bezieht . Als Ergebnis ist this.getURL() nicht definiert. Wie kann ich es bekommen, um auf den aktuellen Kontext von MeasurementObject zu verweisen und daher this.getURL() aufrufen.

const MeasurementObject = { 

    getType(){ 
     return "a" 
    } 

    getURL(){ 
     return "b"; 
    } 

    getScrollToValue(){ 
     return this.getURL(); 
    } 
} 

export default MeasurementObject; 
+1

Fragen Sie den Unterschied zwischen einem JavaScript-Objekt-Literal und einer Funktion oder einer Klasse? –

+3

Sie haben Ihre Frage zu einer völlig anderen Frage bearbeitet. Danke, dass du die Zeit verschwendest. – naomik

+1

Sie scheinen Ihre Frage vollständig geändert zu haben. Wenn Sie die Funktion mit 'MeasurementObject.getScrollToValue()' aufrufen, bezieht sich 'this' in der Methode auf' MeasurementObject', also haben Sie eine gute Funktion. Nicht sicher, was du mit * meinst "Das' dies' innerhalb der Methode ... bezieht sich auf den ausführenden Kontext "*. –

Antwort

1

, wenn Sie eine Klasse exportieren, ohne es instanziiert, alle Eigenschaften, die Sie definieren, auf dem Prototyp eingestellt. und Sie haben keinen Kontext, müssen Sie instanziieren und Sie können dann "das" verwenden.

Nun zu Ihrem Beispiel das "Dies" innerhalb Ihrer Funktion, die sich auf das Objekt bezieht, aber Sie geben es nicht zurück.

Wenn Sie ein Objekt wie dieses definieren, arbeiten Sie bereits an einer Instanz und die Eigenschaften werden auf das Objekt und nicht auf seinen Prototyp gesetzt.

Update

Wenn Sie dies tun:

class MeasurementClass { 

    getType(){ 
     return "a" 
    }, 

    getURL(){ 
     return "b"; 
    }, 

    getScrollToValue(){ 
     return this.getURL(); 
    } 
} 

, was man bekommt, ist so etwas wie:

function MeasurementClass(){} 
MeasurementClass.prototype.getType = function(){ return "a" } 
MeasurementClass.prototype.getURL = function(){ return "b"; } 
MeasurementClass.prototype.getScrollToValue = function(){ return  this.getURL(); } 

Und dann, wenn Sie es versuchen Zugriff ohne MeasurementClass.getScrollToValue

Instanziieren

Yo Du versuchst auf etwas zuzugreifen, das nicht existiert.

jedoch, wenn Sie instanziieren die Funktion all dieser Prototyp Eigenschaften zum Beispiel vererbt werden so:

const measurementClass = new MeasurementClass(); 

measurementClass wird eine Instanz von MeasurementClass sein und all seinen Prototyp erben.

Hoffe, dass hilft ein wenig.

+0

Sie scheinen 'class' mit' const' zu verwechseln. Nein, Objektliterale erstellen keine Klassen mit Prototypobjekten. – Bergi

+0

Bergi Objekt litteral - Sie kamen hier viel zu spät seine erste Frage war mit der Klasse verbunden, aber danke für Ihren Grund free downvote. –

+0

Ah, ich sah diese schreckliche Änderung der Frage nicht. Trotzdem, deine Antwort hatte es falsch, danke für den Schnitt :-) – Bergi

2

Die Tatsache, dass Sie sie exportieren, macht keinen Unterschied.

MeasurementClass ist ein -Konstruktorfunktion mit 3 auf dem MeasurementClass.prototype definierten Methoden. getType, getURL und getScrollToValue

Für die Klasse zu verwenden, würden Sie die Klasse mit dem new Schlüsselwort instanziieren müssen. (new MeasurementClass()).methodName(...)

vs.

MeasurementObject ist ein Objektliteral mit 3 direkt auf dem Objekt definierten Methoden. getType, getURL und getScrollToValue

das Objekt zu verwenden ist nur eine Frage der obj.methodName() Aufruf

+0

beiseite: Sie brauchen diese zusätzlichen Wrapping-Parens nicht Verwenden Sie Konstruktorresultate, 'new MeasurementClass(). methodName()' funktioniert gleich. – dandavis

Verwandte Themen