2012-04-04 13 views
0

Ich hatte einige Pseudoklassen, die einen großen Teil ihrer Initialisierung geteilt. Ich beschloss, diese Initialisierung herauszunehmen und eine Basisklasse zu erstellen, von der sie erben werden.Javascript Vererbung mit super() Anruf

function BaseClass(param1, param2) { 
    ... 
} 

function SubClassA(param1) { 
    ... 
} 

function SubClassB(param1) { 
    ... 
} 

Ich möchte SubClass1 und SubClass2 von BaseClass auf folgende Weise erben:

SubClassA(param1) Konstruktor ruft BaseClass(param1, "I am A.")

SubClassB(param1) Konstruktor BaseClass(param1, "I am B.") ruft

so fügt BaseClass einige Eigenschaften zu ihnen. Dann führen beide Unterklassen ihre eigene Initialisierung durch.

Jetzt kann ich nicht einfach SubClassA.prototype = new BaseClass() tun, weil ich möchte, dass der Superkonstruktor Parameter nimmt. Wie macht man das elegant?

Antwort

2
function SubClassA(param1) { 
    BaseClass.call(this, param1, "I Am A."); 
} 

function SubClassB(param1) { 
    BaseClass.call(this, param1, "I Am B."); 
} 

Wenn Sie eine new SubClassA(param1) oder new SubClassB(param1) Basiskonstruktor tun mit den entsprechenden Parametern aufgerufen werden.

Es gibt auch andere Möglichkeiten als SubClassA.prototype = new BaseClass() Basisklasse zu definieren. Sie können die Frage this für einige Details überprüfen. (Disclaimer: Die Frage nach mir gefragt wurde.)

+0

Sie verdammen Ninjas zu drucken! ;) – kiswa

+0

Ah, Call() kam mir nicht in den Sinn. Ok, danke;) @kiswa, wenn es dir nichts ausmacht, nehme ich taskinoor an, da er das erste Poster war :) – Imp

+0

Scheint mir fair. Aber fühlen Sie sich frei, beide zu erhöhen!;) Außerdem habe ich einen Link zu MDN für weitere Details hinzugefügt, wenn Sie interessiert sind. – kiswa

1

Ich habe etwas ähnliches, und ich tue dies:

function SubClass (param1) { 
    BaseClass.call(this, param1, "I am A."); 
} 

Das gibt mir alle Eigenschaften von BaseClass auf dem Instanzobjekt von SubClass.

EDIT: Hier finden Sie einige Informationen zu the call function. Es ist nützlich, weil Sie angeben können, was this während des Aufrufs ist, und eine Argumentliste bereitstellen.

2

Ich machte einen Objective-JavaScript-HelferClass.js genannt - https://github.com/eppz/eppz-js - soley aus diesem Grunde (ohne zusätzlichen Standardcode anzuwenden, schnitt auch Prototypen problemlos nach unten).

es verwenden können Sie einfach diese Einstellung machen, wie:

var BaseClass = Class.extend 
({ 
    param1: null, 
    param2: null, 

    construct: function(param1, param2) 
    { 
     this.param1 = param1; 
     this.param2 = param2; 
    }, 
}); 

var SubClassA = BaseClass.extend 
({ 
    construct: function(param1) 
    { 
     this.super.construct(param1, 'This is A.'); 
    }, 
}); 

var SubClassB = BaseClass.extend 
({ 
    construct: function(param1) 
    { 
     this.super.construct(param1, 'This is B.'); 
    }, 
}); 

var a = new SubClassA('A stuff.'); 
var b = new SubClassB('B stuff.'); 

console.log(a.param1); // A stuff. 
console.log(b.param1); // B stuff. 

console.log(a.param2); // This is A. 
console.log(b.param2); // This is B. 
0

eine Fläche Methode Rechteck des prototype.Create eine Square-Klasse hinzufügen, die Folgendes erfüllt:

  1. Es ist eine Unterklasse von Rectangle .
  2. Es enthält einen Konstruktor und keine anderen Methoden.
  3. Es kann die Klasse Rectangle Bereich Methode verwenden, um die Fläche eines Quadrats

    class Rectangle { 
    
        constructor(w, h) { 
        this.w = w; 
        this.h = h; 
        } 
    } 
    Rectangle.prototype.area = function() 
    { 
        var a = this.w * this.h; 
        return a; 
    } 
    class Square extends Rectangle{ 
        constructor(r) { 
         super(r, r) 
         } 
        } 
    
        const rec = new Rectangle(3, 4); 
        const sqr = new Square(3); 
    
        console.log(rec.area()); 
        console.log(sqr.area());