2013-07-21 5 views
8

Diese answer on Object.create() method in JavaScript in SO spricht über Differentialvererbung. Es geht weiter, das zu sagen:Was ist die Differentialvererbung in JavaScript?

Diese Methoden, die Ihnen leicht implementieren Differential Vererbung ermöglicht es, wo Objekte von anderen Objekten direkt erben können.

So weit ich weiß, erlaubte JavaScript Objekten immer direkt von anderen Objekten über prototypische Vererbung zu erben. Es gibt kein Konzept einer Klasse in JavaScript. Also was bedeutet differenzielle Vererbung wirklich und warum heißt es so?

P.S: Ich hatte vor einiger Zeit einen Kommentar zu dieser Antwort fallen lassen, aber ich erhielt keine Antworten. Also wollte ich es mit der größeren und großartigen Community von SO-JavaScript-Nutzern klären.

+6

Offenbar ist ["differential vererbung"] (https://en.wikipedia.org/wiki/Differential_inheritance) nur eine andere Art, "prototypische Vererbung" zu sagen. – rid

+1

[Dies könnte besser beschreiben.] (Https://developer.mozilla.org/en/docs/Differential_inheritance_in_JavaScript) –

+0

@SheikhHeera: Eigentlich nicht, weil das dort angegebene Beispiel nicht funktioniert und zumindest irreführend ist. – Bergi

Antwort

8

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.

+0

Statt 'init()' zu verwenden, hat 'Object.create()' ein zweites Argument: die Eigenschaften. Dies kann verwendet werden, um die Eigenschaften der Instanz eleganter zu füllen, wie im OP-Link beschrieben (http://stackoverflow.com/questions/2709612/using-object-create-instead-of-new/2709811#2709811). – Ben

+1

@Steve: Eleganter? Ich bezweifle es, da es * Eigenschaftsdeskriptoren * nicht einfache Eigenschaften braucht. Wenn Sie "normale" (beschreibbare, aufzählbare) Eigenschaften haben wollen, enthält das eine Menge Vortex. – Bergi

+0

wahr, guter Punkt - viel Overhead da :) – Ben