Строковый прототип, изменяющий себя

Вы могли использовать механизмы синхронизации (как монитор или semaphor) для проверки, что один запрос журнала обрабатывается прежде, чем принять следующее. Это могло все быть скрыто от кода, назвав регистрирующиеся стандартные программы.

10
задан ChrisR 23 October 2009 в 18:46
поделиться

4 ответа

Примитивы 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
18
ответ дан 3 December 2019 в 20:05
поделиться

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

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

...?»

-2
ответ дан 3 December 2019 в 20:05
поделиться

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

3
ответ дан 3 December 2019 в 20:05
поделиться

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

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

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

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

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

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

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

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:

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

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

0
ответ дан 3 December 2019 в 20:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: