Это происходит потому, что объект создается и сразу выбрасывается при назначении, потому что это строковый литерал.
Итак, в первой версии объект создается и сохраняется, поэтому testString - это объект, а не строковый литерал. Во втором случае объект создается и выбрасывается, поэтому все свойства теряются ...
Теперь попробуйте заменить эту строку на:
var testString = 'Loremipsumdolorsitamet,consectetur'._str_substr();
Интересно, правда? Он по-прежнему возвращает строковый примитив, но это можно исправить ...
String.prototype._str_substr = function(len) {
var ret = this.substr(this._str_index1, len);
this._str_index1 = this._str_index1 + len;
return new String(ret);
};
Конечно, это всего лишь предложения, призванные помочь объяснить, почему литералы действуют не так, как объекты, а не рекомендации реального мира ...