Was ist in JavaScript der Unterschied zwischen diesen beiden Beispielen:
Voraussetzung:
function SomeBaseClass(){
}
SomeBaseClass.prototype = {
doThis : function(){
},
doThat : function(){
}
}
Vererbungsbeispiel A mit Object.create:
function MyClass(){
}
MyClass.prototype = Object.create(SomeBaseClass.prototype);
Vererbungsbeispiel B mit dem neuen Schlüsselwort
function MyClass(){
}
MyClass.prototype = new SomeBaseClass();
Beide Beispiele scheinen dasselbe zu tun. Wann würden Sie einen über den anderen wählen?
Eine zusätzliche Frage: Betrachten Sie den Code im folgenden Link (Zeile 15), in dem ein Verweis auf den eigenen Konstruktor der Funktion im Prototyp gespeichert ist. Warum ist das nützlich?
https://github.com/mrdoob/three.js/blob/master/src/loaders/ImageLoader.js
Auszug (wenn Sie den Link nicht öffnen möchten):
THREE.ImageLoader.prototype = {
constructor: THREE.ImageLoader
}
javascript
inheritance
object-create
ChrisRich
quelle
quelle
Object.create
. Dies ist ein Fehler und sollte erneut geöffnet werden.Antworten:
In Ihrer Frage haben Sie erwähnt, dass
Both examples seem to do the same thing
es überhaupt nicht wahr ist, weilDein erstes Beispiel
In diesem Beispiel erben Sie nur,
SomeBaseClass' prototype
aber was ist, wenn Sie eine Eigenschaft in IhremSomeBaseClass
Like haben?und wenn du es gerne benutzt
Das
obj
Objekt hat keinepublicProperty
Eigenschaft wie in diesem Beispiel .Dein zweites Beispiel
Es führt die
constructor
Funktion aus, erstellt eine Instanz desSomeBaseClass
gesamtenSomeBaseClass
Objekts und erbt es . Also, wenn Sie verwendenIn diesem Fall steht seine
publicProperty
Eigenschaft auch demobj
Objekt wie in diesem Beispiel zur Verfügung .Da das
Object.create
in einigen alten Browsern nicht verfügbar ist, können Sie es in diesem Fall verwendenDer obige Code fügt nur
Object.create
Funktionen hinzu , wenn diese nicht verfügbar sind, sodass Sie dieObject.create
Funktion verwenden können. Ich denke, der obige Code beschreibt, wasObject.create
tatsächlich funktioniert. Hoffe, es wird irgendwie helfen.quelle
SomeBaseClass
.Das stimmt in deinem Fall.
Wenn
SomeBaseClass
ein Funktionskörper vorhanden ist, wird dieser mit demnew
Schlüsselwort ausgeführt. Dies ist normalerweise nicht beabsichtigt - Sie möchten nur die Prototypenkette einrichten. In einigen Fällen kann es sogar zu schwerwiegenden Problemen kommen, da Sie tatsächlich ein Objekt instanziieren , dessen Variablen mit privatem Bereich von allenMyClass
Instanzen gemeinsam genutzt werden, da sie dieselben privilegierten Methoden erben. Andere Nebenwirkungen sind denkbar.Sie sollten es also generell vorziehen
Object.create
. In einigen älteren Browsern wird es jedoch nicht unterstützt. Aus diesem Grund sehen Sie dennew
Ansatz viel zu häufig, da er oft keinen (offensichtlichen) Schaden anrichtet. Schauen Sie sich auch diese Antwort an .quelle
Der Unterschied wird offensichtlich, wenn Sie
Object.create()
ihn bestimmungsgemäß verwenden. Tatsächlich verbirgt es dasprototype
Wort vollständig aus Ihrem Code , es erledigt den Job unter der Haube. MitObject.create()
können wir gehen wieUnd dann können wir andere Objekte daraus erweitern / erben
Dies ist also ein anderes Konzept, eine "objektorientiertere" Art der Vererbung. Es gibt zum Beispiel keine "Konstruktorfunktion", die standardmäßig verwendet wird
Object.create()
. Aber Sie können natürlich auch eine selbst definierte Konstruktorfunktion innerhalb dieser Objekte erstellen und aufrufen .Ein Argument für die Verwendung
Object.create()
ist, dass es möglicherweise natürlicher aussieht, andere Objekte zu mischen / * zu erben *, als die Standardmethode von Javascripts zu verwenden .quelle
Object.create
kann den klassischen Ansatz nicht wirklich ersetzen,new
wenn eine Konstruktorfunktion benötigt wirdObject.create
keine Funktion aufgerufen wird, die zum Erstellen von Abschlüssen erforderlich wäre. NatürlichObject.create
können Sie mit eineinit
Methode auf Ihre Objekte setzen und diese sofort aufrufen, und sie wird möglicherweise sogar zurückgegeben,this
sodass Sie eine präzise Syntax erhalten - aber warten Sie, das ist dann ein Konstruktor.new
verwendet "Objektverknüpfung", also gibt es keinen großen Unterschied. Tatsächlich gibt es nur zwei Dinge:.constructor
Wird aufgerufen.init
, und diese Funktion hat keine.prototype
Eigenschaft, die auf Ihr Prototypobjekt verweist. Der Rest ist nur Syntax - und ich ziehenew X
überObject.create(x).init()
.Ich bin kein Experte für Java-Skripte, aber hier ist ein einfaches Beispiel, um den Unterschied zwischen "Object.create" und "new" zu verstehen.
Schritt 1: Erstellen Sie die übergeordnete Funktion mit einigen Eigenschaften und Aktionen.
Schritt 2: Erstellen Sie eine untergeordnete Funktion (PersonSalary), die mit dem Schlüsselwort New über die Funktion Person hinausgeht .
Schritt 3: Erstellen Sie mit dem Schlüsselwort Object.create eine zweite untergeordnete Funktion (PersonLeaves), die über die Funktion Person hinausgeht .
// Überprüfen Sie nun beide Prototypen der untergeordneten Funktionen.
Diese beiden untergeordneten Funktionen werden mit dem Prototyp Person (übergeordnete Funktion) verknüpft und können auf dessen Methoden zugreifen. Wenn Sie jedoch eine untergeordnete Funktion mit new erstellen, wird ein brandneues Objekt mit allen übergeordneten Eigenschaften zurückgegeben, die wir nicht benötigen, und auch, wenn Sie welche erstellen Objekt oder Funktion mit "Neu" wird diese übergeordnete Funktion ausgeführt, die wir nicht sein wollen.
Hier sind die Imbissbuden
quelle