2009-10-23 16 views
8

O ile wiem, to nie jest możliwe, aby zmodyfikować obiekt od siebie w ten sposób:prototyp String modyfikowania się

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

Więc to nie jest w ogóle możliwe, aby pozwolić funkcją ciąg modyfikować siebie?

Odpowiedz

16

Prymitywy String są niezmienne, nie można ich zmienić po ich utworzeniu.

Oznacza to, że znaki w nich nie mogą zostać zmienione, a wszelkie operacje na łańcuchach faktycznie tworzą nowe łańcuchy.

Być może chcesz zaimplementować rodzaj konstruktora sznurków?

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

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

+0

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

-1

Struny są niezmienne; to, o co prosisz, to jak powiedzenie: "Dlaczego nie mogę zrobić:

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

...?"

3

Podczas ciągi są niezmienne, próbując przypisać nic do this w każda klasa wygeneruje błąd.

0

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

Powiązane problemy