Hallo,
Hier klappt's nicht mal mit dem prototype-Objekt, aber mit...
String.prototype.obj=function(){function F(){}F.prototype=this;return new F();};
// Allgemeiner: Object.prototype.newobj=function(){function F(){}F.prototype=this;return new F();};
var e = s.newobj();
alert( e.proto.length ); // Ausgabe: 11
> ...hat man auch endlich Zugriff auf die nicht iterable length-Eigenschaft :).
Natürlich ist length immer iterable, aber nur bei String-Objects, weil bei String-Primitives gar nix iterable ist.
Warum es hier funktioniert? Weil »this« in der Methode immer schon ein Object ist.
String.prototype.m = function () { alert(typeof this); };
s = "";
alert(typeof s);
s.m();
alert(typeof s);
s kann ich nie als Prototyp nehmen, solange es ein Primitive ist, aber es findet bei primitiveValue.methode() eine interne Umwandlung in Object statt, um die Methode in der Prototype-Chain zu finden. Die Umwandlung ist aber nur »virtuell« und gilt nur für den Kontext des Methodenaufrufs.
Mathias