字符串对象与文字 - 修改原型?

sje*_*397 5 javascript

我想知道为什么似乎在字符串文字的原型中添加一个方法似乎有效,但添加一个属性不是吗?我在玩这个问题的想法,并有以下代码:

String.prototype._str_index1 = 0;
String.prototype._str_reset = function() {
    this._str_index1 = 0;
};
String.prototype._str_substr = function(len) {
  var ret = this.substr(this._str_index1, len);
  this._str_index1 = this._str_index1 + len;
  return ret;
};

var testString = new String('Loremipsumdolorsitamet,consectetur');
log(testString._str_substr(5));
log(testString._str_substr(4));
?
Run Code Online (Sandbox Code Playgroud)

这很好用.但是,如果我将第三行更改为:

var testString = 'Loremipsumdolorsitamet,consectetur';
Run Code Online (Sandbox Code Playgroud)

...似乎虽然该方法_str_substr存在且可在字符串文字上调用,但该属性的值_str_index1始终为0.

这是怎么回事?

Mar*_*pel 8

String每次尝试调用String对象的方法时,字符串基元都会转换为瞬态对象(JavaScript引擎会String在必要时在内部将字符串基元转换为对象).在此函数返回后,String对象(不引人注意地)转换回字符串原语(在引擎盖下)并返回此新原语(并且大部分时间分配给变量); 每次String调用对象的方法时.

因此,在每次调用之后testString._str_substr,_str_index1抛弃对象并在再次调用时_str_index1创建一个新对象(带有重置)_str_substr.

另见MDC:

因为JavaScript自动在字符串基元和String对象之间进行转换,所以可以在字符串基元上调用String对象的任何方法.JavaScript自动将字符串原语转换为临时String对象,调用该方法,然后丢弃临时String对象.