Ich möchte wissen, was der Kernunterschied zwischen ist
Objektorientierte und objektbasierte Sprachen
Ich habe viele Beiträge gelesen, von denen alle zwei Dinge sagen
Objektorientierte Sprache unterstützt alle Funktionen von OOPs, und objektbasierte Sprache unterstützt nicht alle Funktionen von OOPs wie Polymorphismus und Vererbung.
Sie geben ein Beispiel für Javascript als objektbasiert und Java als objektorientiert
Gefällt mir diesem Beitrag von stackoverflow
Unterschied zwischen objektorientierter und objektbasierter Sprache
Aber ich möchte wissen, was der Kernunterschied zwischen beiden Konzepten ist, unabhängig von der Sprache.
Habe die Antwort bekommen
Endlich habe ich das Ding
dank Matías Fidemraizer
Antwort, die nicht von irgendeiner Sprache abhängig ist, nicht von irgendeinem Merkmal, der Kernunterschied, auf den ich mich freue
Die Sprache, die selbst Objekte enthält, wird als objektbasierte Sprache bezeichnet, und die Sprache mit den folgenden objektorientierten Konzepten wird als objektorientierte Sprache bezeichnet
JavaScript ist eine prototyporientierte Sprache.
Es kann tatsächliche Objekte aus einer Konstruktorfunktion erstellen und hat fast alle Funktionen, die jedes Objekt haben könnte:
In JavaScript hat jedes Objekt einen Prototyp, einschließlich Funktionen. Der Prototyp selbst ist eine rudimentäre Methode, um object-Mitglieder zu jeder neu erstellten Instanz des gesamten Objekts hinzuzufügen.
var constructor = function() { };
constructor.prototype.text = "hello world";
alert(new constructor().text); // This alerts hello world
Warum ist JavaScript keine objektorientierte Programmiersprache (Scripting)? Weil es keine Funktion hat, die den Anforderungen der Definition der objektorientierten Programmierung entspricht:
Vielleicht habe ich vergessen, ein anderes Detail zu erwähnen, aber ich glaube wirklich, dass dies eine gute Zusammenfassung ist.
Der Hauptunterschied besteht darin, dass eine objektorientierte Programmiersprache die Merkmale aufweist, die ein objektorientiertes Paradigma aufweisen muss, um als objektorientierte Programmiersprache betrachtet zu werden. Daher ist JavaScript fürs Erste keine objektorientierte Programmiersprache, da es an Polymorphismus und Vererbung mangelt.
Ästhetisch gesehen, ja, ES2015 und höher hat eine wesentliche Verbesserung, die eine objektorientierte Programmierung nicht vollständig, sondern näher betrachtet: syntaktischer Zucker, um in die Oberklasse zu rufen.
Zum Beispiel:
class A {
doStuff() {
console.log("hello world");
}
}
class B extends A {
doStuff() {
super.doStuff();
console.log("...and goodbye!");
}
}
Dies ist Polymorphismus. Eine spezialisiertere Klasse kann ihre Basisklasse überschreiben, um ein Funktionsverhalten vollständig zu ändern oder das zu tun, was die Basis bereits getan hat, indem sie der Funktion neuen Code hinzufügt.
BTW, ES2015 und höher weisen noch keine echte Einkapselung auf: Wo sind hier Zugriffsmodifizierer wie private
oder public
? Nirgends.
Und am Ende des Tages implementieren ES2015 und höher klassenbasierte OOP, aber es ist immer noch eine syntaktische Zuckerschicht auf ECMAScript 5.x ... Der obige Code funktioniert immer noch mit Prototypen unter den Hauben und so weiter funktioniert genauso, als ob Sie es in ECMAScript 5.x codieren würden:
function A() {
}
A.prototype.doStuff = function() {
console.log("hello world");
};
function B() {
}
B.prototype = Object.create(A.prototype);
B.prototype.doStuff = function() {
A.prototype.doStuff.call(this);
console.log("...and goodbye!");
};
Hoffen wir, dass ich diese Antwort erneut aktualisieren muss, da ES2020 bereits Zugriffsmodifizierer vorgeschlagen hat und wir JavaScript in einer anderen Sprache betrachten können, die die objektorientierte Programmierung vollständig unterstützt!
Objektbasiert Sprachen umfassen grundsätzlich jede Sprache, die die integrierte Fähigkeit zum einfachen Erstellen und Verwenden von Objekten bietet. Es gibt ein Hauptkriterium:
Kapselung. Objects ist eine API zugeordnet, die normalerweise so ist, dass Sie eher mit dem Objekt arbeiten, indem Sie sagen, was zu tun ist, als indem Sie eine Funktion darauf ausführen.
Die meisten objektbasierten Sprachen definieren Objekte anhand von "Klassen", bei denen es sich im Wesentlichen um Entwürfe für ein Objekt handelt. Die Klasse legt die interne Struktur des Objekts fest und definiert die API.
Dies ist jedoch nicht der einzige Weg. In JavaScript zum Beispiel haben Objekte nicht wirklich "Klassen". Jedes Objekt kann beliebige Eigenschaften haben. Und da Funktionen in JavaScript erstklassige Werte sind, können sie als Eigenschaften für das Objekt festgelegt werden und als API des Objekts dienen.
Was objektbasierte, aber nicht objektorientierte Sprachen angeht, wäre Visual Basic ein gutes Beispiel (nicht das .net-Material; ich spreche von VB6 und VBA). Klassen existieren, können aber nicht voneinander erben.
Objektorientiert Sprachen sind objektbasierte Sprachen, die einen Schritt weiter gehen. Sie haben eine integrierte Unterstützung für die beiden anderen Säulen der OOP:
Vererbung. Objekte müssen die Fähigkeit besitzen, Spezialisierungen eines anderen Objektes zu sein (und als solche angesehen zu werden). Dies bedeutet zum Beispiel, "Hund" als "Tier, das Stöcke bellen und Stöcke holen kann" definieren zu können.
In modernen Sprachen hat es normalerweise die Form eines class eines Objekts, das von einem class eines anderen Objekts erbt. Dies ist jedoch keine Anforderung; Im Gegensatz zu dem, was manche Leute Ihnen sagen wollen, erfordert die Definition von OOP überhaupt keine Klassen.
Polymorphismus. Code muss in der Lage sein, ein Objekt zu verwenden, ohne zu wissen, um welche Art es sich handelt.
Die meisten Sprachen (insbesondere statisch typisierte) definieren Polymorphismus in Bezug auf Klassen und Vererbung. Wenn Sie über eine Klasse B verfügen, die von A erbt, kann Code, der einen Verweis auf ein A erfordert, stattdessen ein B annehmen, nicht jedoch eine Klasse A, die nicht mit A zusammenhängt. Java hat auch das Schlüsselwort interface
, mit dem Sie definieren können eine Reihe von Verhaltensweisen, die eine Klasse implementieren muss. Jedes Objekt, dessen Klasse explizit implements X
und somit die an der Schnittstelle X definierten Funktionen implementiert, gilt als Instanz des Typs X.
Andere Sprachen, wie z. B. JavaScript, lassen Sie jedes beliebige Objekt passieren. Solange das Objekt die richtige Schnittstelle bietet, ist es egal, um welche Art von Objekt es sich handelt. Dies wird als "Enten-Typisierung" bezeichnet und ist fast die reinste Form von Polymorphismus, die es gibt.
Das Verwenden von Objekten bedeutet nicht, dass Sie OOP ausführen, auch wenn Sie in einer vollständigen OO - Sprache keine OO - Techniken implementieren.
grausam ...
OOP und OBP sind verschiedene Arten von Programmiersprachen.
OOP: folgt Polymorphismus, Vererbung und Einkapselung (PIE).
OBP: folgt Polymorphismus und Verkapselung.
Es gibt vier Hauptelemente, denen eine Programmiersprache entsprechen muss, um eine echte objektorientierte Sprache zu sein. Dies sind: Abstraktion, Verkapselung, Modularität und Hierarchie.
Wir können jedoch ein Sprachobjekt basierend aufrufen, wenn dieses die ersten dort vorhandenen Elemente unterstützt. Sobald eine Programmiersprache das Konzept von Object unterstützt, unterstützt sie inhärent die ersten drei Elemente, da sie ein inhärentes Merkmal eines Objekts sind.
JavaScript als Sprache kann nicht als objektorientierte, sondern als objektbasierte Sprache bezeichnet werden, da Hierarchie (insbesondere Vererbung) nicht unterstützt wird.