2

我正在尝试这样做:

String.prototype.clear = function(){
    alert(this.value);
    this = ''; // I want to set value to '' here
}

var temp = 'Hello';
temp.clear();// After this step temp should be ''

但我得到无效的左手分配错误。我发现这个问题可以作为参考,但这并不是我真正想要的。我还发现“this”是不可变的。

那么,有什么办法可以完成我的任务吗?我没有在任何地方使用它。只是在玩。谢谢。

4

4 回答 4

1

您可以创建一个名为 MyMutableString 的类,例如:

function MyMutableString(s) {
   this.string = s;
   this.clear = function() {
      this.string = "";
   }
}

现在您创建一个实例并像这样使用它:

var s = new MyMutableString("my str");
s.clear(); // makes string stored inside object `s` empty
console.log(s.string);
于 2012-12-20T13:47:22.843 回答
1

简而言之:

你不能。

字符串是不可变的。一旦制作完成,就永远无法更改字符串。

您必须将字符串设置为空字符串才能“清除”它

var str = "String";
str='';

请注意,这不会更改字符串,而是设置str为字符串的新实例,旧的实例会被垃圾收集

它甚至比调用 Object 的 Prototypes 方法更短,它的作用完全相同。而且您不必对原生 Objects 原型进行调整


编辑 - 感谢Florian Margaine指出这一点

如果您经常设置空字符串并且可能会更改您未来的清除“定义”,您可以使用返回 `` 或空字符串的函数

function clearString () {
    return ''
}
var str = "Asd"
var str = clearString()

或者只是将变量设置为空字符串

var emptyString = ''
var str = "Asd"
str = emptyString //''

现在,如果您想更改''nullundefined

var emptyString = null

这也可以,因为原始数据类型是作为值而不是通过引用传递的

但我建议不要为这样的东西修改对象原型

于 2012-12-20T13:59:19.297 回答
0

像这样的对象副本呢?

String.prototype.clear = function(){
    alert(this);
    return '';
}


var temp = 'Hello';
var newTemp = temp.clear();
alert(newTemp);
于 2012-12-20T13:50:17.223 回答
0

除了创建包装器之外,最好的方法是使用函数式方法。

String.prototype.clear = function() {
    return '';
};

var t = 'hello';
t = t.clear();

为什么不只是做t = '';,你说?好吧,今天清算可能意味着投入'',但它可能意味着明天投入null。有一个点来改变它可能是值得的。或者根本没有。

于 2012-12-20T13:50:34.870 回答