Frage

ich von diesen Beitrag , dass es ein anti-Muster Object Prototyp in JavaScript ändern. Ich war neugierig, aber wenn es weithin als Antipattern betrachtet hat andere ‚eingebaute‘ Prototypen zu ändern.

Zum Beispiel: sagen wir eine setPixel(x,y,color) Funktion hinzufügen wollten CanvasRenderingContext2D - abstrahieren aus der Pflicht der die Bilddaten des Kontextes immer, um ein Pixel zu einer bestimmten Farbeinstellung und setzte die Bilddaten zurück

.
CanvasRenderingContext2D.prototype.setPixel = function(x, y, color){
    var imgdata = this.createImageData(1,1);
    imgdata.data[0] = color.r;
    imgdata.data[1] = color.g;
    imgdata.data[2] = color.b;
    imgdata.data[3] = color.a;
    this.putImageData(imgdata,x,y);
};

Ich habe diesen Code nicht getestet, aber Sie bekommen die Idee. Ist so etwas wie dieses gegen 'best practices'?

War es hilfreich?

Lösung

Im Allgemeinen, wenn Sie einen Prototyp zu einem der Basisobjekte in JavaScript hinzufügen, sollten Sie einen guten Grund haben, und es gibt wirklich keinen Grund, Objekt zu ändern, da Sie nicht wissen, wie das, was das Endergebnis vorherzuzusagen sein dieser Modifikation wird.

Ich neige dazu, starts hinzuzufügen, zu schneiden und einige andere Funktionen String, zum Beispiel, da diese Hilfsfunktionen sind, ebenso wie einige Funktionen Array hinzufügen, die für Firefox existiert, aber nicht IE nur Sinn macht (wie die Filterfunktion) .

Also, auf die Leinwand Zugabe ist in Ordnung, aber was ist, wenn jemand Ihre Bibliothek verwendet und mit excanvas. Wird es ein Problem verursachen?

Sie wollen entweder das erforschen, oder ein Dokument, dass es nicht für excanvas funktioniert, und wenn Sie einen kleinen Test, um zu zeigen haben, können Sie sie sind, so dass, wenn später ist es eine neue Version, und Ihr Problem verschwindet Menschen kann man erkennen, überprüfen.

UPDATE: Sie wollen, dies zu tun:

if (!CanvasRenderingContext2D.setPixel) {
...
}

So, wenn jemand umfassen tut man mit diesem Namen es nicht überschrieben werden, aber Sie müssen es ordnungsgemäß behandeln.

Andere Tipps

Ich würde es nicht tun, wie es es schwer zu verfolgen, macht was, wo implementiert. Es führt auch das Risiko von zwei Menschen das gleiche Verhalten zu überschreiben.

Auf jeden Fall nicht; wenn die Methode auf das Objekt auf diese Weise verwendet ist, dann ist es eine elegante Lösung.

Alle diese „anti-Muster“ Vorschläge sind nicht blind angenommen werden. Egal, was sie sagen, manchmal die beste Antwort ist, die Kugel zu beißen und geht gegen die Konvention Dinge zum Laufen zu bringen. Dies hängt natürlich stark von Ihrem Szenario.

Ich bin von einer Situation erinnert, wo Tage wurden reorganisieren Code, um den entsprechenden fix „den richtigen Weg“ ausgegeben, wenn eine einfache GO TO hat große gearbeitet würde und nur ein paar Minuten gedauert zu implementieren. Am Ende wurde eine Reihe von Bugs erstellt, weil Code geändert wurde, der nicht geändert werden mußte. Bin ich ein Fan von Aussagen GO? Auf keinen Fall! Aber wenn man unter Verwendung einen Monat im Wert von Kopfschmerzen verhindert, dann gibt es keine Frage.

Ich sehe kein Problem, solange die Funktionalität oder Namensüberschreibt nicht, was schon da ist. Ich kenne einige, die den string Prototyp für Trim Funktionen ändern.

http://www.somacon.com/p355.php

Was ist lustig, C # hat jetzt eine Erweiterungsmethode, was heißt, die effektiv das gleiche tut.

Nicht so an sich, sondern die Ajax-Bibliothek Entscheidungsträger könnten Probleme haben, wenn sie nicht auf den eingebauten Typen und ihre Eigenschaften verlassen können. So könnten Sie Code brechen, die auf ein bestimmtes Verhalten beruht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top