donp: Unobtrusive Prototyping?

Beitrag lesen

Hi,

Ich bastle derzeit an (m)einem kleinen Javascript Framework.

Ich auch, mehr oder weniger. Eigentlich nur an einer Bibliothek nützlicher Funktionen. Deren gibt es schon einige, aber die einen können mir zu viel, andere zu wenig...

Natürlich soll das System resistent gegen fremde ebenfalls geladene Scripts / Bibliotheken / Frameworks sein und diese in ihrer Funktionsweise auch nicht beeinflussen. Es soll also nicht möglich sein, dass eigene Komponenten von etwas anderem überschrieben werden, oder dass eine eigene Komponente etwas anderes überschreibt. So viel Anspruch darf sein.

...ist aber in letzter Konsequenz unmöglich. *Einen* Tod muss man sterben.

Möglichkeit 5 - die ProtoypeNamespaces
document.body.FrameworkNamespace.dummy()
Sowas in dieser Art wäre mir glaube ich am liebsten. Allerdings fehlen mir (funktionierende) Ansätze das umzusetzen.

Das ähnelt doch irgendwie deinen Varianten 1 und 2.
Ein Ansatz wäre vielleicht:

  
Object.prototype.begetObject = function () {  
    function F() {}  
    F.prototype = this;  
    return new F();  
};  
document.body.FrameworkNamespace = document.body.begetObject();  
document.body.FrameworkNamespace.dummy = function(){ alert(this.className) };  

Mit der neuen Methode .begetObject() (Dank an Douglas Crockford) kann sich jedes Objekt vervielfältigen, d.h. es ergibt sich ein neues, leeres Objekt, das *alle* Eigenschaften u. Methoden des alten Objekts prototypisch erbt. Anschließend kann man es beliebig erweitern, das alte Objekt wird davon nicht berührt.

Ich selbst habe begetObject() noch so erweitert, dass es ein anderes Objekt als Parameter nimmt und dessen eigene (nicht vererbte) Eigenschaften u. Methoden als eigene Eigensch./Methoden des neuen Objekts setzt. Diese Neue Methode bgetObj() kann also ein Objekt richtiggehend klonen indem man z.B. sagt

  
newObject = oldObject.bgetObj(oldObject);  

newObject hat jetzt alle Eigensch./Methoden von OldObject selbst, d.h. die nachträgliche Änderung einer Eigenschaft/Methode von oldObject wirkt sich auf newObject nicht mehr aus. Den Quelltext dieser neuen Methode habe ich im Moment aber nicht zur Verfügung. Kann ich bei Interesse aber nachliefern.

Gruß, Don P