Prototipo de cadena que se modifica.
-
06-07-2019 - |
Pregunta
Por lo que sé, no es posible modificar un objeto de sí mismo de esta manera:
String.prototype.append = function(val){
this = this + val;
}
Entonces, ¿no es posible en absoluto permitir que una función de cadena se modifique a sí misma?
Solución
Las primitivas String son inmutables, no se pueden cambiar después de que se crean.
Lo que significa que los caracteres que se encuentran dentro de ellos no se pueden cambiar y cualquier operación en las cadenas crea realmente nuevas cadenas.
¿Quizás quieras implementar una especie de generador de cadenas?
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
Otros consejos
Mientras que las cadenas son inmutables, intentar asignar cualquier cosa a esto
en cualquier clase generará un error.
He estado investigando lo mismo ... Primero que nada, claro que no puedes hacer esto + = x, 'este' es un objeto, no puedes usar el operador + en los objetos.
Hay métodos "detrás de la escena" que se llaman, por ejemplo,
String.prototype.example = function(){ alert( this ); }
en realidad está llamando
String.prototype.example = function(){ alert( this.valueOf() ); }
Entonces, lo que necesita encontrar es un valor relevante que haga lo contrario, algo como esto.setValue (). Excepto que no hay uno. Lo mismo vale para Number también.
Incluso los métodos integrados están sujetos a eso
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 puedes; 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
Las cuerdas son inmutables; lo que estás preguntando es como decir, " ¿Por qué no puedo hacerlo?
Number.prototype.accumulate = function (x) {
this = this + x;
};
...? "