2009-10-23 68 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()); 

這很煩人,但你去那裏