Вопрос

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

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

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

Это было полезно?

Решение

примитивы 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

Другие советы

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

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

Существуют методы «за кулисами», которые вызываются, например,

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

фактически звонит

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

Итак, вам нужно найти соответствующее значение, которое делает обратное - что-то вроде this.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());

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

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

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

...?"

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top