字符串原型中无法赋值this,如何为字符串对象设置新值?
字符串原型方法无法修改原字符串的原因及解决方案
核心原因
- 字符串是不可变的原始值:JavaScript里字符串属于原始值类型,一旦创建就不能被修改。调用字符串原型方法时,JS会临时把原始字符串包装成String对象,但这个包装对象只是临时存在,方法执行完就会被销毁,无法改变原字符串。
this是只读变量:无论在什么函数中,this都是只读的,直接给this赋值必然报错,这和类型无关。- 数组是可变引用类型:数组属于引用类型,
this.push是直接修改数组对象的内部数据,所以能直接改变原数组。
正确解决方案:返回新字符串并重新赋值
因为字符串不可变,原型方法只能生成新字符串并返回,由调用者将新值重新赋值给原变量。修改你的代码示例:
function testfunction() { const newValue = "new test"; console.log(newValue); return newValue; } Object.defineProperty(String.prototype, 'testfunction', { value: testfunction, enumerable: true }); let s = "i am a test"; s = s.testfunction(); // 重新赋值给原变量 console.log(s); // 输出 "new test"
如果需要基于原字符串做修改(比如拼接、替换),可以利用this自动转换为原始值的特性:
function append(str) { return this + str; } String.prototype.append = append; let s = "hello"; s = s.append(" world!"); console.log(s); // 输出 "hello world!"
内容的提问来源于stack exchange,提问作者Gary
相关产品推荐
相关产品推荐

