2009-07-08 6 views
15

Wir haben vor kurzem eine Web-App mit Prototype erstellt, die die Funktionalität von Class.Create() in erheblichem Umfang nutzt. Im Moment erwägen wir, zu jQuery zu migrieren, da es als eine "bessere" Bibliothek angesehen wird. Ich habe ein wenig über das Thema gelesen und herausgefunden, dass jQuery keine direkte integrierte Unterstützung für die Klassenerstellung wie Prototyp hat. Natürlich gibt es immer noch die .prototype und die jQuery.extend (wie in https://stackoverflow.com/questions/79477/how-to-create-an-object-oriented-class-in-jquery erwähnt), aber nach etwas mehr suchen, habe ich das Gefühl, dass jQuery wirklich nicht auf diese Weise Skript ‚will‘ ...Warum scheint jQuery die Verwendung von regulärem OOP zu verhindern?

Die gleiche Seite hat eine Erwähnung von John Resigs Classy-Plugin, das für mich großartig aussah. Auf der Seite steht jedoch, dass es sich tatsächlich um einen Aprilscherz handelte und dass Resig tatsächlich rät, den Code nicht zu verwenden. Ich bin gerne bereit, aber ich würde gerne verstehen, was der Grund für all das ist, und, natürlich, was es ist, dass sie wollen, dass Sie stattdessen tun. Kann mich jemand aufklären?

-edit-

Dank für die interessanten Antworten. Aus Gründen der Klarheit: Bedeutet dies, dass es gut ist, die Klassen, die ich in Prototype geschrieben habe, in die jQuery-Methode umzuformen, um eine Klasse zu "formen" und sie immer noch in der gleichen "Art und Weise" wie zuvor zu verwenden? Oder wird das immer noch als schlechte Praxis angesehen, und sollte ich einen anderen Ansatz verwenden?

+4

Zu Ihrer Information JavaScript ist keine klassenbasierte Sprache. Es ist eine prototypische Sprache. – rahul

+0

... und als solche mehr Lisp als C: http://javascript.crockford.com/javascript.html – Boldewyn

+0

(Von jemandem, der vier Jahre Vorsprung hat, um den Unterschied zu sehen) Auch wenn dies [Artikel] (http://jqueryvsmootools.com/) ist über Mootools vs JQuery, die Begründung hinter Mootools gilt im Wesentlichen für PrototypeJS. Der Abschnitt [motto] (http://jqueryvsmootools.com/#mottos) sagt alles. TL; DR; JQuery ist für die DOM-Manipulation konzipiert, während Mootool (und Prototype) mit DOM ** und ** zusätzlichen Dienstprogrammen wie der Klassenbasis-OOP für die Prototyp-Basissprache usw. entworfen wurde. – OnesimusUnbound

Antwort

11

Erste crappy Google-Suche nach „objektorientierten javascript“ erwies sich dies ... aber es erklärt den Punkt, den ich vermitteln wollte:

JavaScript Object-Oriented Programming

nur einen Blick auf den ersten Absatz und Sie find:

Javascript ist keine vollständig objektorientierte Programmiersprache. Die Verwendung von Klassen in JS basiert auf der Prototyp-Funktionalität. Die Prototype-Bibliothek maskiert die Verwendung der Prototyp-Funktionalität zum Erstellen Ihrer Klasse. jQuery erwartet, dass Sie die Prototyp-Funktionalität auf die gleiche Weise wie bei Verwendung von regulärem JS verwenden, um jQuery selbst zu erweitern und eigene benutzerdefinierte Objekte zu erstellen.

+7

jQuery verbessert JavaScript und versucht nicht, eine andere Sprache zu simulieren. +1 – Boldewyn

+4

Der zitierte Absatz ist einfach falsch. Javascript ist eine vollständig objektorientierte Programmiersprache. Was es nicht ist, ist eine klassenbasierte OO-Sprache. Die Designer von Prototype entschieden sich dafür, einige Klassen-Fu zur Verfügung zu stellen, um eine Menge Leute komfortabler zu machen (einschließlich mir, als ich damit anfing). Nachdem ich Crockfords "Javascript: The Good Parts" gelesen habe, denke ich, dass dies ein Fehler war. –

+0

@Colin: richtig. und, ja, totaler Fehler. Ich mag Dojo aus den gleichen Gründen nicht. –

1

Ich hatte genau das gleiche Problem mit der Konvertierung von Prototype zu jQuery, und ich kann immer noch nur denken, dass ja, es scheint, dass sie nicht alles in oop im Sinne von Prototype sind. Dennoch, Codierung jQuery Sie finden sich stark auf JSON, was ich denke, ist die pseudo-offizielle nächste Sache zu oop Sie werden.

Einige der jQuery UI Sachen iteriert tatsächlich über alle Eigenschaften eines Parameters, den Sie übergeben, und macht Sachen damit, was bedeutet, dass Sie, sagen wir, überhaupt Object.prototype nicht tun können, weil das Zeug hinzufügen wird zu jedem Objekt, das die jQuery ui versuchen wird, als relevanten Parameter zu behandeln.

Geschwindigkeit und Skalierbarkeit ist erstaunlich, obwohl, so ich würde sagen, es ist eine Frage der Zeit ist, bevor Sie Prototype verwinden und COMETO mit der Tatsache, dass Justin Antwort macht tatsächlich einen wichtigen Punkt :)

0

jQuery haben nicht einfach integrierte Unterstützung für Klasse-creation wie Prototype tut

Wie sollte es nicht. Die Klassenerstellung wird am besten dem Programmierer und nicht der Bibliothek überlassen. Ich begann mit der Prototypbibliothek und zog weg, weil es so aufgebläht war. OOP in JavaScript ist überhaupt nicht schwer. Solange Sie wissen, wie man Prototypen benutzt, geht es Ihnen gut.

Das Entsprechen von privaten Elementen in JavaScript wird im Umgang mit Class.create von Prototype schwierig. Und ehrlich gesagt, glaube ich nicht Class.create gibt Ihnen nichts nützliches, das Sie nicht einfach selbst oder mit jQuery machen können.

Sie können immer beide Bibliotheken gleichzeitig verwenden, um den Übergang zu erleichtern. jQuery hat dieses nette noConflict Feature, das die $ Funktion an seinen ursprünglichen Besitzer zurückgibt.

Verwandte Themen