2009-10-23 78 views
8

据我知道这是不可能从自己这样修改的对象:字符串原型修改本身

String.prototype.append = function(val){ 
    this = this + val; 
} 

那么,这根本不可能让一个字符串函数修改自己?

回答

16

String基元是不可改变的,它们在创建后不能更改。

这意味着它们中的字符可能不会改变,对字符串的任何操作实际上都会创建新的字符串。

也许你想要实现一种字符串生成器?

function StringBuilder() { 
    var values = []; 

    return { 
    append: function (value) { 
     values.push(value); 
    }, 
    toString: function() { 
     return values.join(''); 
    } 
    }; 
} 

var sb1 = new StringBuilder(); 

sb1.append('foo'); 
sb1.append('bar'); 
console.log(sb1.toString()); // foobar 
+0

不,我研究原型,并检查了在JS继承一些事情和封锁。有趣的东西,我有一个模糊的感觉,字符串确实是不可变的。 Array.pop确实可以修改自己(或值的内部哈希),但String无法修改它自己似乎有点不合逻辑。 JS中的五个基元之一的字符串解释了很多! – ChrisR 2009-10-23 19:30:22

+0

在'var sb1 = new StringBuilder()'后面有一个变量sb1不是StringBuilder实例的API似乎非常不直观。为什么不给StringBuilder.prototype分配{append:...}并将'var values = []'改为'this.values = []'?这只是为了避免用'this.'将append/toString中的值作为前缀,还是有些我在这里没有考虑的东西? – ledneb 2012-09-27 09:54:38

-1

字符串是不可变的; “你为什么不能这样做:”为什么我不能这样做:

Number.prototype.accumulate = function (x) { 
    this = this + x; 
}; 

......?“

3

尽管字符串是不可改变的,试图在分配什么this任何类将抛出一个错误。

0

我一直在研究相同的...首先,当然你不能只是做这个+ = x,'this'是一个对象,你不能在对象上使用+运算符。

有方法即得到所谓的“幕后” - 例如

String.prototype.example = function(){ alert(this); } 

实际上是调用

String.prototype.example = function(){ alert(this.valueOf()); } 

所以,你需要找到的是,做相反的相关值 - 像this.setValue()。除了没有一个。 Number也一样。

即使内置的方法是由

var str = 'aaa'; 
str.replace(/a/, 'b'); 
console.log(str); // still 'aaa' - replace acts as static function 
str = str.replace(/a/, 'b'); 
console.log(str); // 'bbb' - assign result of method back to the object 

在其他一些可以在对象的约束;例如在日期:

Date.prototype.example = function(){ 
this.setMonth(this.getMonth()+6); 
}; 
var a=new Date(); 
alert(a.getMonth()); 
a.example(); 
alert(a.getMonth()); 

这很烦人,但你去那里