[英]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 也按值传递它 。 这意味着您不会在任何地方修改原始字符串。 你必须退货。
这是反向函数的简单实现:
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.