globe: Unobtrusive Prototyping?

Beitrag lesen

n'abend,

document.body.FrameworkNamespace = document.body.begetObject();
document.body.FrameworkNamespace.dummy = function(){ alert(this.className) };
[/code]

Wenn ich das richtig sehe, würde ich so aber mit einer Kopie von document.body arbeiten, nicht mit einer Referenz auf document.body. Ich bekomme eingangs zwar die Daten aus document.body zu gesicht, verändere ich aber etwas in der Kopie, ändert sich das nicht in der original-Instanz.

// Objekt-Ableiter nach http://javascript.crockford.com/prototypal.html  
function object(o) {  
        function F() {}  
        F.prototype = o;  
        return new F();  
    }  
  
// Test Objekt  
function MyOne()  
{  
    this.message = 'initial message from constructor';  
    this.alert = function(){ alert(this.message) };  
}  
  
// original-Instanz  
var s = new MyOne();  
  
// abgeleitete Instanz  
var e = object(s);  
  
// Attribut in original-Instanz manipulieren  
s.message = 'new message from original instance';  
e.alert(); // Ausgabe: »new message from original instance«  
  
// Attribut in abgeleiteter Instanz ändern  
e.message = 'altered message from extended instance';  
s.alert(); // Ausgabe: »new message from original instance«  
e.alert(); // Ausgabe: altered message from extended instance«  
  
// Attribut in original-Instanz manipulieren  
s.message = 'altered message from original instance';  
e.alert();  // Ausgabe: altered message from original instance«  

Wie du siehst arbeitet man also definitiv mit einem neuen (vom original abgeleiteten) Objekt, welches als Initialwerte die Werte des originalen Objekts gesetzt hat.

Mal ganz davon abgesehen bin ich über ein Phänomen gestolpert, was den Anwendungsbereich dieser Ableitungsgeschichte etwas reduziert:

var s = "hello world";  
var e = object( s );  
alert( s.length ); // Ausgabe: 11  
alert( e.length ); // Ausgabe: undefined

Da wird also irgendwas nicht durchgereicht?

var s = new String( "hello world" );  
var e = object( s );  
alert( s.length ); // Ausgabe: 11  
alert( e.length ); // Fehler: String.prototype.toString called on incompatible Object

ahja? darf ich String also nicht erweitern, oder wie sehe ich das?

var s = [1,2,3];  
var e = object( s );  
alert( s.length ); // Ausgabe: 3  
alert( e.length ); // AUsgabe: 3

oha, Arrays darf ich also vergewaltigen, interessant.

  
var s = new Number(123.45);  
var e = object( s );  
alert( s.toFixed() ); // Ausgabe: 123  
alert( e.toFixed() ); // Fehler: Number.prototype.toFixed called on incompatible Object

Dafür Number auch nicht (ähnliche Probleme wie bei String)

scheint wohl nett zu sein, wenn man eigene Objekte erweitern/vererben will, aber eher unbrauchbar, wenn man an Javascript-eigenem Kram spielen möchte.

(Beobachtet unter Firefox 2.0.0.7 running on Mac OS X 10.4.10)

weiterhin schönen abend...

--
Freundlich wie man war, hat man mir Großbuchstaben geschenkt.
sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|