protótipo corda modificando-se
-
06-07-2019 - |
Pergunta
Tanto quanto eu sei que não é possível modificar um objeto de si mesmo desta maneira:
String.prototype.append = function(val){
this = this + val;
}
Assim, não é possível a todos para deixar a função de cadeia modificar-se?
Solução
O corda primitivos são imutáveis, eles não podem ser alteradas depois que eles são criadas.
O que significa que os personagens dentro deles não podem ser alteradas e quaisquer operações em cordas realmente criar novas strings.
Talvez você deseja implementar uma espécie de construtor corda?
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
Outras dicas
Enquanto strings são imutáveis, tentando atribuir qualquer para this
em qualquer classe irá lançar um erro.
Eu estive pesquisando o mesmo ... Primeiro de tudo, é claro que você não pode simplesmente fazer isso + = x, 'isto' é um objeto, você não pode usar o operador + em objetos.
Existem 'por trás da cena' métodos que são chamados - por exemplo
String.prototype.example = function(){ alert( this ); }
é realmente chamando
String.prototype.example = function(){ alert( this.valueOf() ); }
Então, o que você precisa encontrar é um valor relevante que faz o contrário - algo como this.setValue (). Exceto que não há um. O mesmo vale para o número também.
Mesmo o construído em métodos são vinculados por essa
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
Em alguns outros objetos que puder; por exemplo, em um Data:
Date.prototype.example = function(){
this.setMonth( this.getMonth()+6 );
};
var a=new Date();
alert(a.getMonth());
a.example();
alert(a.getMonth());
É chato, mas lá vai
Strings são imutáveis; o que você está perguntando é como dizer: "Por que eu não posso fazer:
Number.prototype.accumulate = function (x) {
this = this + x;
};
...? "