繁体   English   中英

使用String.prototype扩展String时,无法覆盖javascript中的“ this”

[英]Cannot overwrite “this” in javascript when extending String with String.prototype

我想为一个JavaScript字符串创建一个可变的reverse方法。

TL; DR:

这是我的无效尝试:

String.prototype.reverse = function() {


    var reversed = {};
    j = 0;
    for (i = this.length - 1; i >= 0; i--)
    {
        reversed[j++] = this[i];
    }
    for (i in reversed)
    {
        this[i] = reversed[i];
    }
};

...

str1 = "hello";
str1.reverse();
console.log(str1); //hello, not olleh

这个小测试进一步证明了它根本不会改变字符串:

String.prototype.makeFirstCharX = function() {
    console.log(this[0]); //h
    this[0] = 'x'; //no error
    console.log(this[0]); //h ??
};

str1.makeFirstCharX();
console.log(str1); //hello, not xello

无论如何,在本机JS类型的新原型函数中是否要覆盖this值? 为什么this[0]='x'不会给出错误,而不仅仅是默默地失败?

---这是我对自定义JS对象进行的尝试,该对象确实按预期工作,这是我基于以上几点的目的:

我可以创建一个行为类似于本机字符串的自定义可撤销字符串:

    function MyString(str) {
//set string content and length
        var l = 0;
        for (i in str)
        {
            this[i] = str[i];
            l++;
        }
        this.length = l;

    }
    MyString.prototype.toString = function()
    {
        var retVal = '';
        for (i = 0; i < this.length; i++)
        {
            retVal += this[i];
        }
        return retVal;
    };

    MyString.prototype.reverse = function()
    {
        var reversed = {};
        j = 0;
        for (i = this.length - 1; i >= 0; i--)
        {
            reversed[j++] = this[i];
        }
        for (i in reversed)
        {
            this[i] = reversed[i];
        }
    };

因此,正如预期的那样:

    str = new MyString('string');
    console.log(str); // MyString { 0="s", 1="t", 2="r", more...}
    console.log("" + str); //string
    console.log(str.length); //6
    str.reverse();
    console.log(str); // MyString { 0="g", 1="n", 2="i", more...}
    console.log("" + str); //gnirts

但是,如果我在“真正的” javascript字符串上尝试相同的操作,则它将不起作用。

第一个字符串在Javascript中不可更改。

犀牛书中

在JavaScript中,字符串是不可变的对象,这意味着它们中的字符可能不会更改,并且对字符串的任何操作实际上都会创建新的字符串。 字符串是通过引用而不是值来分配的。 通常,当通过引用分配对象时,通过一个引用对该对象所做的更改将通过对该对象的所有其他引用可见。 但是,由于无法更改字符串,因此您可以对一个字符串对象有多个引用,而不必担心字符串值会在您不知道的情况下发生变化

Javascript 也按值传递它 这意味着您不会在任何地方修改原始字符串。 你必须退货。

这是反向函数的简单实现:

function reverse(s) {
  var reversed = '';
  for (var i = s.length - 1; i >= 0; i--)
    reversed += s[i];
  return reversed;
}

您必须重新分配原始变量。

var original = 'original';
original = reverse(original);

括号表示法不起作用。 字符串

对于使用括号符号的字符访问,尝试删除或为这些属性分配值将不会成功。 所涉及的属性既不可写也不可配置。 (有关更多信息,请参见Object.defineProperty。)

字符串在Javascript中是不可变的,因此您将无法以任何方式对其进行更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM