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

Javascript 字符串对象与文字-修改原型?,javascript,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)

我想知道为什么向字符串文本的原型中添加方法似乎有效,但添加属性却无效?我在玩弄与以下代码相关的想法:

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));
​
这个很好用。但是,如果我将最后第三行更改为:

var testString = 'Loremipsumdolorsitamet,consectetur';
…虽然方法
\u str\u substr
存在并且可以在字符串文本上调用,但属性
\u str\u index1
的值始终为0


怎么了?

之所以会发生这种情况,是因为创建了对象,并在赋值时立即将其丢弃,因为它是一个字符串文本

在第一个版本中,创建并保留了一个对象,因此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);
};

当然,这些只是一些建议,旨在帮助解释为什么文字行为不同于对象,而不是真实世界的建议

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

因此,在每次调用
testString.\u str\u substr
之后,
\u str\u index1
将与对象一起丢弃,并在再次调用
\u str\u substr
时创建一个新对象(带有重置
\u str\u index1

另见:

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


不,我也是@不,我不知道你的意思。“对象被创建并在赋值时立即丢弃”听起来像是在初始赋值(
var testString=…
)时创建并丢弃了一个对象,而不是在调用
\u str\u substr
时。嗯,我在ECMAScript规范中查找它,但找不到它(至少在这个时候不会)但是如果是这样的话,
String
对象的方法在字符串赋值后不能被调用。每次调用
String
对象的方法时,字符串原语都必须被转换。Marcel:我想我们谈论的是同一件事……如果字符串被临时创建,字符串对象就会被临时创建可能我错了,关键是从声明时起它就不是对象了,它是一个基元;除了它的值之外,它是无状态的。当调用字符串基元的“方法”时,它就像将string.prototype.x应用于文本字符串。你是对的(关于这一点,我们谈论的是同一件事)。是的,这正是我想说的:)你称之为“字符串文字”的大多数东西实际上被称为“字符串原语”:文字是描述字符串的语法,例如,分配字符串(或数字、布尔值、对象等)对于变量;基元值是变量和对象可以包含的非复合值(除了(其他)对象)。除非不是…..“indexOf”在针对字符串调用时不是函数。。。。