代码之家  ›  专栏  ›  技术社区  ›  sje397

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

  •  5
  • sje397  · 技术社区  · 14 年前

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

    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';
    

    …虽然方法 _str_substr 在字符串文本(属性的值)上存在并可调用 _str_index1 总是0。

    怎么了?

    2 回复  |  直到 14 年前
        1
  •  8
  •   Marcel Korpel    14 年前

    字符串原语转换为瞬态 String 每次尝试调用 对象(javascript引擎在内部将字符串原语转换为 如有必要,请使用对象)。函数返回后, 字符串 对象被(不引人注目地)转换回字符串原语(在hood下),并返回这个新原语(大部分时间都分配给变量); 每次一个方法 对象被调用 .

    所以,每次调用 testString._str_substr , _str_index1 与对象和新对象一起丢弃(通过重置 _ str_索引1 )创建时间 _str_substr 再次调用。

    另请参见 MDC :

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

        2
  •  2
  •   Dagg Nabbit    14 年前

    发生这种情况是因为对象是被创建的,并且在进行赋值时立即被丢弃,因为它是一个字符串文本。

    所以在第一个版本中,会创建和保存一个对象,所以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);
    };
    

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