1UnitedPower: Typecasting

Hallo,
ich habe mir gerade die Finger wund gegoogelt, aber scheinbar bin ich gerade unfähig die richtigen Stichworte zu finden. Ich frage mich gerade ob es in JavaScript möglich ist Typecasting (wie z.B. in Java) durchzuführen.

  
function BaseClass(){};  
  
function SubClass(){};  
  
SubClass.prototype = new BaseClass();  
SubClass.prototype.constructor = SubClass;  
SubClass.protptype.supr = BaseClass.prototype;  
  
SubClass.prototype.foo = function(){ /* some code */ };  
  
var myInstance = new BaseClass();  
  
// Die nächste Zeile ist Pseudocode, doch genau dafür suche ich gerade eine echte Lösung  
  
(myInstance AS SubClass).foo();  

schon im Voraus vielen Dank
-1UP

  1. Moin Moin!

    Ich frage mich gerade ob es in JavaScript möglich ist Typecasting (wie z.B. in Java) durchzuführen.

    Ich denke nicht, denn Javascript teilt sich mit Java kaum mehr als die ersten vier Buchstaben und einen Teil der von C geerbten Syntax.

    function BaseClass(){};

    function SubClass(){};

    SubClass.prototype = new BaseClass();
    SubClass.prototype.constructor = SubClass;
    SubClass.protptype.supr = BaseClass.prototype;

    SubClass.prototype.foo = function(){ /* some code */ };

    var myInstance = new BaseClass();

    // Die nächste Zeile ist Pseudocode, doch genau dafür suche ich gerade eine echte Lösung

    (myInstance AS SubClass).foo();

      
    Wozu glaubst Du, solche Konstrukte zu brauchen? Oder anders gefragt: Was ist Dein eigentliches Problem?  
      
    Alexander
    
    -- 
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
    
    1. Wozu glaubst Du, solche Konstrukte zu brauchen? Oder anders gefragt: Was ist Dein eigentliches Problem?

      Also folgendes: Meine Basisklasse hat eine Methode "clone()", die eine Kopie der aufrufenden Instanz erzeugt. Meine abgeleitete Klasse ergänzt einige Funktionalitäten. Wenn ich nun "clone()" von einer Instanz der abgeleiteten Klasse aufrufe erhalte ich eine Instanz der Basisklasse, aber ich würde gerne die Methoden der speziellen Klasse verwendbar machen.

      1. Moin Moin!

        Wozu glaubst Du, solche Konstrukte zu brauchen? Oder anders gefragt: Was ist Dein eigentliches Problem?

        Also folgendes: Meine Basisklasse hat eine Methode "clone()", die eine Kopie der aufrufenden Instanz erzeugt. Meine abgeleitete Klasse ergänzt einige Funktionalitäten. Wenn ich nun "clone()" von einer Instanz der abgeleiteten Klasse aufrufe erhalte ich eine Instanz der Basisklasse, aber ich würde gerne die Methoden der speziellen Klasse verwendbar machen.

        Mit anderen Worten: clone() ist kaputt.

        Es gibt bei MDN eine krude Krücke, die eine Objektmethode auf ein völlig anderes Objekt anwendet. Vielleicht hilft Dir das.

          
        var map = Array.prototype.map  
        var a = map.call("Hello World", function(x) { return x.charCodeAt(0); })  
        // a now equals [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]  
        
        

        Sauberer wäre wohl, clone() zu reparieren.

        Alexander

        --
        Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
        1. Mit anderen Worten: clone() ist kaputt.

          In Wahrheit ist das Problem noch etwas komplizierter, "clone()" stammt aus einer dritten Bibliothek und das Verhalten ist dort durchaus gewünscht.

          Es gibt bei MDN eine krude Krücke, die eine Objektmethode auf ein völlig anderes Objekt anwendet. Vielleicht hilft Dir das.

          Vielen Dank für den Link, das ist so ziemlich genau die Lösung zu meinem Problem.

        2. Es gibt bei MDN eine krude Krücke, die eine Objektmethode auf ein völlig anderes Objekt anwendet.

          Das ist keine krude Lücke sondern weit verbreiteter Standard der funktionalen Programmierung in JavaScript. Es ist ganz normal, dass man Methoden, die irgendwo gespeichert sind, aufruft und dabei this auf ein angegebenes Objekt setzt, z.B. beim Binding und Currying.

          Mathias

      2. Meine Basisklasse hat eine Methode "clone()", die eine Kopie der aufrufenden Instanz erzeugt. Meine abgeleitete Klasse ergänzt einige Funktionalitäten. Wenn ich nun "clone()" von einer Instanz der abgeleiteten Klasse aufrufe erhalte ich eine Instanz der Basisklasse, aber ich würde gerne die Methoden der speziellen Klasse verwendbar machen.

        Das kapiere ich nicht. Dann schreibe clone() halt um, damit sie nicht immer den Konstruktor der Basisklasse, sondern den jeweiligen Konstruktor verwendet. Den jeweiligen nimmst du aus this.constructor, dazu setzt du die Eigenschaft schließlich. Diese liefert dir für die abgeleitete Klasse den Konstruktur eben dieser.

        Beispiel:

        // Zwei Helferfunktionen aus [link:http://molily.de/weblog/javascript-pseudoklassen]  
          
        Object_create = Object.create || function (o) {  
           var F = function() {};  
           F.prototype = o;  
           return new F();  
        };  
          
        function inheritPseudoClass (Super, Sub) {  
           Sub.prototype = Object_create(Super.prototype);  
           Sub.prototype.constructor = Sub;  
        }  
          
        function Base (name) { this.name = name; }  
          
        Base.prototype.clone = function () {  
          return new this.constructor(this.name);  
        };  
          
        function Inherited (name) {  
          Base.apply(this, arguments);  
        }  
          
        inheritPseudoClass(Base, Inherited);  
          
        var inherited = new Inherited('bar');  
        var clone = inherited.clone();  
        alert(clone instanceof Base);  
        alert(clone instanceof Inherited);  
        alert(clone.name);
        

        Mathias

  2. SubClass.protptype.supr = BaseClass.prototype;

    Tippfehler protptype

    SubClass.prototype.foo = function(){ /* some code */ };

    var myInstance = new BaseClass();

    // Die nächste Zeile ist Pseudocode, doch genau dafür suche ich gerade eine echte Lösung

    (myInstance AS SubClass).foo();

    BaseClass.prototype.foo.call(myInstance)
    myInstance.supr.foo.call(MyInstance)

    Allerdings verstehe ich nicht, wie das dein Problem löst…

    Mathias