He estado investigando lo mismo ... Antes que nada, por supuesto no puedes hacer esto + = x, 'esto' es un objeto, no puedes usar el operador + en los objetos.
hay 'detrás de la escena' métodos que serán llamadas - por ejemplo
String.prototype.example = function(){ alert(this); }
que realmente está llamando
String.prototype.example = function(){ alert(this.valueOf()); }
Así que lo que hay que encontrar es un valor relevante que hace el contrario - algo como esto.setValue(). Excepto que no hay uno. Lo mismo vale para Number también.
Incluso el construido en los métodos que están obligados por
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
En algunos otros objetos que puedas; por ejemplo, en una Fecha:
Date.prototype.example = function(){
this.setMonth(this.getMonth()+6);
};
var a=new Date();
alert(a.getMonth());
a.example();
alert(a.getMonth());
Es molesto, pero hay que ir
prototipos No, estoy investigando y comprobando algunas cosas sobre la herencia y cierres en JS. Interesante y tuve la vaga sensación de que una Cadena era inmutable. Parecía un tanto ilógico que Array.pop pudiera modificarse a sí mismo (o al hash interno de valores), pero String no podría modificarse. Sin embargo, ¡la secuencia de uno de los cinco primitivos en JS explica mucho! – ChrisR
Parece bastante poco intuitivo tener una API donde la variable sb1 no es una instancia de StringBuilder después de 'var sb1 = new StringBuilder()'. ¿Por qué no asignar {append: ...} a StringBuilder.prototype y cambiar 'var values = []' a 'this.values = []'? ¿Esto es solo para evitar el prefijo de valores en append/toString con 'this' o hay algo que no estoy considerando aquí? – ledneb