2016-09-15 3 views
0

Ich habe versucht, eine Anwendung in JavaScript zu erstellen, die einfach ein Objekt erstellt und löscht, aber ich versuche, es mit Klassen zu implementieren. Der Code sieht wie folgt aus:Aufruf der Elternfunktion innerhalb des Klickereignisses

Meine erste Datei:

class GeneralObject { 
 

 
    constructor(elementName) { 
 
     this.domElement = elementName; 
 
    } 
 
    
 
    createObject() { 
 
     $(document.createElement('span')) 
 
     .html(this.domElement) 
 
     .appendTo($('#someOtherElement')); 
 
    } 
 
    
 
    deleteObject() { 
 
     this.domElement.remove(); 
 
    } 
 
}

Meine zweite Datei:

class SpecificObject extends GeneralObject { 
 
    
 
    create() { 
 
    
 
    // call the creator from parent class 
 
    super.createObject(); 
 
    
 
    // create a div 
 
    // i know the div has no expansion 
 
    $(document.createElement('div')) 
 
     .click(function() { 
 
     
 
     // trying to call the parent function remove 
 
     // here comes the error 
 
     super.removeObject(); 
 
     }) 
 
     .appendTo($("#someOtherElement")); 
 
    }

Mein Ziel ist es, das Objekt, das ich erstellt habe, mit der Klick-Funktion zu löschen, aber ich kann in dieser Instanz nicht auf die Elternfunktion zugreifen. Ich bekomme diesen Fehler:

'super' keyword unexpected here

Ich hoffe, Sie können mir sagen, wie ich meine Elternfunktion in dieser Klickfunktion aufrufen. Ich freue mich auch auf einen Kommentar zu dieser Implementierung über das Schlüsselwort "class", weil ich überall nur Klassenkonstrukte mit "Prototyp" sehe. Was ist der "richtige/bessere" Weg?

Vielen Dank für das Lesen dieser Post

+2

Warum würden Sie denken, das ist eine gute Idee, wenn es so unglaublich einfach ist, ohne dass die Klassen zu tun. – adeneo

+0

@adeneo ja könnte es mit Funktionen gelöst werden, aber ich möchte es nur mit Klassen versuchen. Es ist nur zum Spaß und Erkenntnisgewinn :) – rpanske

+0

@ 4castle Verdammt, ich bin müde. Du hast recht. Ich weiß nicht, woher ich diese Idee habe. Zeit fürs Bett, denke ich. – vlaz

Antwort

2

super nur in Instanzmethoden zur Verfügung. Ihre innere anonyme Funktion ist keine Instanzmethode, daher hat sie keinen Zugriff darauf.

Da Sie jedoch Vererbung verwenden, ist die Funktion von this zugänglich. Daher können Sie die Lösung von this answer anwenden, um innerhalb einer inneren Funktion auf this zuzugreifen.

create() { 
    var self = this; // get a reference to `this` 

    super.createObject(); 

    $(document.createElement('div')) 
    .click(function() { 
     self.removeObject(); // `self` is `this` which inherits from `super` 
    }) 
    .appendTo($("#someOtherElement")); 
} 

Da Sie nur eine einzige Funktion innerhalb dieser click Funktion ausführen, können Sie alternativ die Funktionsreferenz als Parameter übergeben:

$(document.createElement('div')) 
    .click(super.removeObject) 
    .appendTo($("#someOtherElement")); 
+0

Ich musste meine Antwort bearbeiten, weil es sich herausstellt, 'var Elternteil = super;' ist ein Syntaxfehler – 4castle

-1

Ich glaube, Sie so etwas wie diese verwenden soll. Das wird gut funktionieren.

class SpecificObject extends GeneralObject { 

    create() { 

    // call the creator from parent class 
    super.createObject(); 

    // create a div 
    // i know the div has no expansion 

    } 

    } 
    $(document.createElement('div')) 
     .click(function() { 

     // trying to call the parent function remove 
     // here comes the error 
     SpecificObject.removeObject(); 
     }) 
     .appendTo($("#someOtherElement")); 

Sie können nicht super innerhalb document.ready Funktion verwenden, da es Funktion nicht die gleiche Klasse ist now.and ist es nicht den gleichen Umfang der Klasse specificobject tragen.

+0

Ich habe dieses 'SpecificObject.removeObject()' versucht, aber jetzt erhalte ich diesen Fehler: _Uncaught TypeError: SpecificObject.removeObject ist keine Funktion_ – rpanske

+0

Ja, und das liegt daran, dass Sie keine Funktion namens removeObject in Ihrer Elternklasse haben, sondern deleteObject(). kannst du das bitte überprüfen und meine Antwort auffrischen oder es akzeptieren. –

+1

Das wird nicht funktionieren, auch wenn die Benennung korrekt war. Es gibt einen großen Unterschied zwischen 'SpecificObject.removeObject' und' SpecificObject.prototype.removeObject' – 4castle

0

es nur Prototypen schließlich basiert Denken Sie daran:

class SpecificObject extends GeneralObject { 

    constructor() { 
    super();// make sure to call super since you extend 
    } 

    create() { 

    // createObject is now available on this 
    this.createObject(); 

    // create a div 
    // i know the div has no expansion 
    $(document.createElement('div')) 
     // renamed from removeObject to deletedObject (typo ?) + fatArrow keep scope to the this of the instance 
     .click(() => this.deleteObject()) 
     .appendTo($("#someOtherElement")); 
    } 
} 
+0

Es ist im Konstruktor – topheman

+1

Mein schlechtes habe es nicht entdeckt. Ich habe den Schnitt gemacht (mit einem dicken ES6-Pfeil geschrieben - du machst auch "var that = this" und dann im click, pass 'function() {that.leleteObject();}' – topheman

Verwandte Themen