Прототип строки, модифицирующий сам себя - PullRequest
9 голосов
/ 23 октября 2009

Насколько я знаю, невозможно изменить объект сам по себе следующим образом:

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

Так нельзя ли вообще позволить строковой функции изменять себя?

Ответы [ 4 ]

17 голосов
/ 23 октября 2009

Примитивы String являются неизменяемыми, их нельзя изменить после создания.

Это означает, что символы внутри них не могут быть изменены, и любые операции со строками фактически создают новые строки.

Возможно, вы хотите реализовать сортировку строк?

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
3 голосов
/ 24 октября 2009

Пока строки неизменяемы, попытка присвоить что-нибудь this в любом классе вызовет ошибку.

0 голосов
/ 09 мая 2010

Я исследовал то же самое ... Прежде всего, конечно, вы не можете просто сделать это + = x, 'this' это объект, вы не можете использовать оператор + на объектах.

Есть методы "за сценой", которые вызываются - например,

String.prototype.example = function(){ alert( this ); }

на самом деле звонит

String.prototype.example = function(){ alert( this.valueOf() ); }

Так что вам нужно найти соответствующее значение, которое делает обратное - что-то вроде этого .setValue (). За исключением того, что нет ни одного. То же самое относится и к номеру.

Даже встроенные методы связаны этим

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

На некоторых других объектах вы можете; например, на дату:

Date.prototype.example = function(){
 this.setMonth( this.getMonth()+6 );
};
var a=new Date();
alert(a.getMonth());
a.example();
alert(a.getMonth());

Это раздражает, но вы идете

0 голосов
/ 23 октября 2009

Строки неизменны; то, что вы спрашиваете, это как сказать: «Почему я не могу сделать:

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

...? "

...