2016-10-31 3 views
0

Sorry für Dump Frage: Ich bin zu js. Ich möchte f2() Funktion in D „Klasse“ außer Kraft zu setzen. Aber aus irgendeinem Grund sagte mir Fire Fox: "Zu viel Rekursion". Könnten Sie mir bitte zeigen, wo die Rekursion stattfindet und wie dieser Code wie erwartet funktioniert?JS Vererbung Beispiel: zu viel Rekursion

var B = function() { 
}; 
B.prototype.f2 = function (x) { 
    return 2 * x; 
}; 

var C = function() { 
    B.call(this); 
}; 

var D = function() { 
    C.call(this); 
}; 

D.prototype.f2 = function (x) { 
    return C.prototype.f2.call(this, x) * 7; 
}; 

inherit(B, C); 
inherit(C, D); 

function inherit(Child, Parent) { 
    Child.prototype = Object.create(Parent.prototype); 
    Child.prototype.constructor = Child; 
} 

var d = new D(); 
console.log(d.f2(3)); 
+2

Ich bin neugierig, warum Sie ES5 Prototyp Ketten befinden sich im Studium so intensiv (basierend auf diesem und mindestens einem ot ihre Frage von dir habe ich beantwortet). Die oben genannte Funktion "vererben" ist veraltet. Ab ES2015, gibt es eine einfache, klare, deklarative Syntax für diese, und dass Syntax kann für ältere Umgebungen transpiled werden, die es noch nicht unterstützen. In dieser Syntax ist es viel einfacher zu verstehen. Das Studium dieser veralteten Methode scheint also nicht optimal zu sein. –

+0

* (nicht meine dv ...) * –

+0

Danke sehr, Ihre Antworten sind sehr hilfreich! Ich besuchte ein Training über klassische oop-Muster in js und wir wurden gebeten, es in zwei Arten ES5 und ES2015 zu implementieren. Aber ich sehe, was du sagst, es macht Sinn und macht die Welt, die ich gerade kenne, klarer. –

Antwort

4

Zwei Probleme:

  1. Sie müssen die XYZ.prototype Objekte einrichten, bevor Sie versuchen, Eigenschaften, um sie hinzuzufügen. Da Ihre inherit Funktion sie erstellt, müssen Sie sicherstellen, dass Sie die Dinge in der richtigen Reihenfolge tun.

  2. Sie haben die Reihenfolge der Eltern und Kind rückwärts in Ihrem inherit Anrufe. Es ist inherit(child, parent), nicht inherit(parent, child).

var B = function() { 
 
}; 
 
B.prototype.f2 = function (x) { 
 
    return 2 * x; 
 
}; 
 

 
var C = function() { 
 
    B.call(this); 
 
}; 
 
inherit(C, B);   // *** Moved and updated 
 

 
var D = function() { 
 
    C.call(this); 
 
}; 
 
inherit(D, C);   // *** Moved and updated 
 

 
D.prototype.f2 = function (x) { 
 
    return C.prototype.f2.call(this, x) * 7; 
 
}; 
 

 
function inherit(Child, Parent) { 
 
    Child.prototype = Object.create(Parent.prototype); 
 
    Child.prototype.constructor = Child; 
 
} 
 

 
var d = new D(); 
 
console.log(d.f2(3));

Die ES2015-Version zum Vergleich:

class B { 
 
    f2(x) { 
 
    return 2 * x; 
 
    } 
 
} 
 

 
class C extends B { 
 
} 
 

 
class D extends C { 
 
    f2(x) { 
 
    return super.f2(x) * 7; 
 
    } 
 
} 
 

 
const d = new D(); 
 
console.log(d.f2(3));

Verwandte Themen