molily: extend Canvas-Framwork-prototype mit CRC2D-props/meths

Beitrag lesen

Hallo,

function Canvas( canvasId ) {
  var canv = document.getElementById( canvasId );
  this.ctx = canv.getContext( '2d' );
  for ( var m in CanvasRenderingContext2D.prototype ) {

Diesen Code solltest du nicht im Konstruktor ausführen, schließlich soll er nur einmal ausgeführt werden, nicht für jede Instanz. Der Prototyp wird ja von allen Instanzen geteilt.

(function( that, m ) {

Indem du that verwendest, welches auf die aktuelle Instanz zeigt, und mit jeder Instanz die Methoden am Prototyp überschreibst, ist effektiv nur eine Instanz von Canvas möglich. (Wenn ich das richtig sehe.)

Wenn du einfach this verwendest und die Methoden nur einmal außerhalb des Konstruktors anlegst, sind mehrere möglich.

if ( typeof that.ctx[m] === 'function' ) {
        // spendabel sein mit Anzahl Parameter, s.d. nie zu wenig:
        Canvas.prototype[m] = function( a,b,c,d,e,f,g,h,i,j,k,l ) {
  that.ctxm;

Du suchst hier

Canvas.prototype[m] = function () {  
  this.ctx[m].[link:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply@title=apply](this, [link:https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope/arguments@title=arguments]);  
};

Das gibt sämtliche Parameter weiter, egal wieviele es gibt.

Jetzt denke ich mir aber, dass die Entwickler gut funktionierender libs Profis sind
und ihre Gründe dafür haben, das manuell zu machen - nur kenne ich diese Gründe
nicht.

Es spricht m.E. nichts dagegen, sämtliche Methoden erst einmal weiterzureichen und gleichzeitig einige Methoden neu zu implementieren, zu erweitern sowie eigene, zusätzliche Methoden anzubieten. Das würde ich von einer Canvas-Abstraktion erwarten: Dass ich sowohl einfachen Zugriff auf die Standard-Low-Level-Funktionen habe als auch Zusatzfunktionen und Helferlein nutzen kann.

Kann mir jemand sagen, ob meine Methode Schwierigkeiten/Fehlerquellen/... birgt?

Nö, das sieht schon sehr gut aus. Ob alle Browser, die Canvas können, auch Zugriff auf CanvasRenderingContext2D erlauben, müsstest du testen.

Mathias