据我知道这是不可能从自己这样修改的对象:字符串原型修改本身
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