2009-10-23 5 views
8

Soweit ich weiß, es ist nicht möglich, ein Objekt von sich selbst auf diese Weise zu ändern:String Prototyp Modifikation selbst

String.prototype.append = function(val){ 
    this = this + val; 
} 

So ist es nicht möglich, überhaupt eine String-Funktion selbst ändern zu lassen?

Antwort

16

Die String Grundelemente sind unveränderlich, sie können nicht geändert werden, nachdem sie erstellt wurden.

Das bedeutet, dass die Zeichen in ihnen nicht geändert werden dürfen und alle Operationen an Strings tatsächlich neue Strings erstellen.

Vielleicht möchten Sie eine Art String Builder implementieren?

function StringBuilder() { 
    var values = []; 

    return { 
    append: function (value) { 
     values.push(value); 
    }, 
    toString: function() { 
     return values.join(''); 
    } 
    }; 
} 

var sb1 = new StringBuilder(); 

sb1.append('foo'); 
sb1.append('bar'); 
console.log(sb1.toString()); // foobar 
+0

Nein, ich bin Prototypen und Check-out einige Dinge auf Erbschaft und Schließungen in JS zu erforschen. Interessantes Zeug und ich hatte ein vages Gefühl, dass ein String tatsächlich unveränderlich war. Es schien nur ein wenig unlogisch, dass Array.pop tatsächlich sich selbst ändern konnte (oder der interne Hash der Werte), aber String konnte sich nicht selbst modifizieren. Stringing eines der fünf Primitive in JS erklärt viel! – ChrisR

+0

Es erscheint ziemlich unintuitiv, eine API zu haben, bei der die Variable sb1 keine Instanz eines StringBuilders nach 'var sb1 = new StringBuilder()' ist. Warum nicht {append: ...} StringBuilder.prototype zuweisen und 'var values ​​= []' in 'this.values ​​= []' ändern? Ist das nur, um zu verhindern, dass Werte in append/toString mit 'this. 'versehen werden oder gibt es etwas, das ich hier nicht in Betracht ziehe? – ledneb

-1

Strings sind unveränderlich; Was Sie fragen, ist wie zu sagen: "Warum kann ich nicht tun:

Number.prototype.accumulate = function (x) { 
    this = this + x; 
}; 

...?"

3

Während Strings unveränderlich sind, versuchen etwas zu this in jede Klasse zuweisen wird einen Fehler werfen.

0

Ich habe das gleiche erforscht ... Vor allem natürlich können Sie nicht einfach tun dies + = x, "das" ist ein Objekt, Sie können nicht den + Operator für Objekte verwenden.

Es gibt ‚hinter den Kulissen‘ Methoden, die aufgerufen werden - zum Beispiel

String.prototype.example = function(){ alert(this); } 

tatsächlich rufe

String.prototype.example = function(){ alert(this.valueOf()); } 

Also, was Sie finden müssen ein relevanter Wert ist, die das Gegenteil tut - etwas wie this.setValue(). Außer dass es keinen gibt. Das Gleiche gilt auch für Nummer.

Auch in Methoden der eingebauten sind, dass Sie können

var str = 'aaa'; 
str.replace(/a/, 'b'); 
console.log(str); // still 'aaa' - replace acts as static function 
str = str.replace(/a/, 'b'); 
console.log(str); // 'bbb' - assign result of method back to the object 

Auf einigen anderen Objekten gebunden; zum Beispiel auf einem Date:

Date.prototype.example = function(){ 
this.setMonth(this.getMonth()+6); 
}; 
var a=new Date(); 
alert(a.getMonth()); 
a.example(); 
alert(a.getMonth()); 

Es ist ärgerlich, aber es gehen Sie