Wie die anderen Kommentatoren und die Artikel, die sie bereits verlinkt haben, ist differentielle Vererbung "nur" die normale, bekannte prototypische Vererbung.
Doch durch die Begriff Differential Vererbung Sie auf einem reineren Muster konzentrieren, als es in JavaScript bekannt ist (obwohl durchaus üblich, in anderen prototypischen Sprachen wie Selbst, Newton oder Io). Im Gegensatz zum pseudo-klassischen Muster gibt es überhaupt keine Konstruktoren mit . Stattdessen erstellen Sie mithilfe von Object.create
ein neues Objekt, das in einem Schritt vom Zielobjekt erbt, und anschließend erstellen Sie die erforderlichen Instanzeigenschaften (nur ) manuell (nicht mit einem Konstruktor). Es ist nicht ungewöhnlich, dass Sie von einem Objekt erben, das Sie andernfalls als Instanz betrachten würden, statt von einem dedizierten Prototyp-Objekt.
var object = Object.prototype;
// a Person constructor and a Person.prototype method would be more familiar
var person = Object.create(object);
person.greet = function() {
console.log("Hi, I'm "+this.firstName+" "+this.lastName);
};
// as would new Person("John", "Doe");
var jo = Object.create(person);
jo.firstName = "John";
jo.lastName = "Doe";
// but what now? We stay with "simple" Object.create here
var ja = Object.create(jo);
ja.firstName = "Jane";
jo.greet();
ja.greet();
Wie Sie eine Jane finden Sie unter Erstellen ist einfach, aber wir würden mit dem new Constructor()
Muster zu durchbrechen, wenn wir sie benutzt hatte. Deshalb empfehlen einige JS-Gurus, das reine Muster überall zu verwenden (damit Sie besser verstehen, was vor sich geht) und glücklich sind, mit EcmaScript 5 Object.create
gegeben worden zu sein. Immer noch das Konstruktormuster verwendend und konventionelle Klassenhierarchien bildend ist in prototypischen Sprachen üblich und hilfreich und in der Tat möglich. Io zum Beispiel wird eine init
Methode (falls vorhanden) jedes Mal wenn Sie clone
ein Objekt, und im obigen Beispiel nennen wir hätte man auch verwendet, der die Initialisierung von Joe einfacher gemacht hätte:
person.init = function(f, l) {
this.firstName = f; this.lastName = l; return this;
}
var jo = Object.create(person).init("John", "Doe");
Es gibt definitiv keine Gerade zu unterscheiden zwischen Differential und prototypischen Vererbung.
Offenbar ist ["differential vererbung"] (https://en.wikipedia.org/wiki/Differential_inheritance) nur eine andere Art, "prototypische Vererbung" zu sagen. – rid
[Dies könnte besser beschreiben.] (Https://developer.mozilla.org/en/docs/Differential_inheritance_in_JavaScript) –
@SheikhHeera: Eigentlich nicht, weil das dort angegebene Beispiel nicht funktioniert und zumindest irreführend ist. – Bergi