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?

¿Fue útil?

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;
};

...? "

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top