2009-10-23 17 views
8

Por lo que yo sé que no es posible modificar un objeto de sí mismo de esta manera:cadena prototipo modificándose

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

Así que no es posible en absoluto a permitir que una función de cadena modificar en sí?

Respuesta

16

Las primitivas String son inmutables, no se pueden cambiar una vez creadas.

Lo que significa que los caracteres dentro de ellos no se pueden cambiar y las operaciones en cadenas realmente crean nuevas cadenas.

Quizás desee 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 
+0

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

+0

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

-1

Las cadenas son inmutables; lo que estás preguntando es como decir: "¿Por qué no puedo hacer:

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

...?"

3

Mientras que las cadenas son inmutables, intentar asignar nada a this en cualquier clase generará un error.

0

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

Cuestiones relacionadas