Badałem to samo ... Po pierwsze, oczywiście nie można tego po prostu zrobić + = x, "to" jest obiektem, nie można użyć operatora + na obiektach.
Istnieją „za sceną” metod, które uzyskać nazywane - na przykład
String.prototype.example = function(){ alert(this); }
faktycznie dzwoni
String.prototype.example = function(){ alert(this.valueOf()); }
Więc co trzeba znaleźć jest odpowiednia wartość, że robi coś przeciwnego - coś podobnego do this.setValue(). Tylko że nie ma. To samo dotyczy również liczby.
Nawet zbudowany w metodach są związane tym
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
na innych obiektach możesz; na przykład na randkę:
Date.prototype.example = function(){
this.setMonth(this.getMonth()+6);
};
var a=new Date();
alert(a.getMonth());
a.example();
alert(a.getMonth());
To irytujące, ale tam
Nie, jestem badania prototypów i sprawdzić kilka rzeczy na temat dziedziczenia i zamknięć w JS. Interesujące rzeczy i miałem niejasne wrażenie, że String jest rzeczywiście niezmienny. Po prostu wydawało się trochę nielogiczne, że Array.pop rzeczywiście może się zmodyfikować (lub wewnętrzny skrót wartości), ale String nie może sam się zmodyfikować. Jednak jedno z pięciu prymitywów w JS wyjaśnia wiele! – ChrisR
Wydaje się dość nieintuicyjne mieć API, w którym zmienna sb1 nie jest instancją StringBuilder po 'var sb1 = new StringBuilder()'. Dlaczego nie przypisać {append: ...} do StringBuilder.prototype i zmienić 'var values = []' na 'this.values = []'? Czy jest to po to, aby uniknąć wartości przedrostkowych w dopisie/toString z "tym" lub czy jest coś, czego nie rozważam tutaj? – ledneb