據我知道這是不可能從自己這樣修改的對象:字符串原型修改本身
String.prototype.append = function(val){
this = this + val;
}
那麼,這根本不可能讓一個字符串函數修改自己?
據我知道這是不可能從自己這樣修改的對象:字符串原型修改本身
String.prototype.append = function(val){
this = this + val;
}
那麼,這根本不可能讓一個字符串函數修改自己?
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
字符串是不可變的; 「你爲什麼不能這樣做:」爲什麼我不能這樣做:
Number.prototype.accumulate = function (x) {
this = this + x;
};
......?「
儘管字符串是不可改變的,試圖在分配什麼到this
任何類將拋出一個錯誤。
我一直在研究相同的...首先,當然你不能只是做這個+ = 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());
這很煩人,但你去那裏
不,我研究原型,並檢查了在JS繼承一些事情和封鎖。有趣的東西,我有一個模糊的感覺,字符串確實是不可變的。 Array.pop確實可以修改自己(或值的內部哈希),但String無法修改它自己似乎有點不合邏輯。 JS中的五個基元之一的字符串解釋了很多! – ChrisR 2009-10-23 19:30:22
在'var sb1 = new StringBuilder()'後面有一個變量sb1不是StringBuilder實例的API似乎非常不直觀。爲什麼不給StringBuilder.prototype分配{append:...}並將'var values = []'改爲'this.values = []'?這只是爲了避免用'this.'將append/toString中的值作爲前綴,還是有些我在這裏沒有考慮的東西? – ledneb 2012-09-27 09:54:38