String 是不可变的,这意味着我们只能读取其属性,而不能修改、创建或删除任何属性或方法。所以基本上字符串是冻结的。
我的问题是如何将新方法添加到字符串原型中?
var a = '';
String.prototype.hi = function(){
console.log('hi');
}
a.hi()
Output: hi
为什么它没有抛出任何错误?
字符串是不可变的,这意味着我们只能读取其属性,而不能修改、创建或删除任何属性或方法
这不是真的。字符串不可变是指字符串对象本身被冻结。这并不意味着String.prototype
是一个单独的对象,被冻结。当我们向String.prototype
对象添加属性时,这并不意味着我们已经改变了任何字符串。它只是另一个对象,而不是字符串本身。
Javascript中的String
是不可变的,它是一个真实的陈述。所以,你是对的。 因此,字符串的值是不可变的,但不是prototype
。字符串从其父对象继承了prototype
。原型中可用的函数不会修改字符串的值,它会返回字符串的新实例。
在继承方面,JavaScript 只有一个构造: 对象。每个对象都有一个私有属性,其中包含指向 另一个物体称为它的原型。该原型对象具有 它自己的原型,依此类推,直到到达一个对象,空 作为其原型。根据定义,null 没有原型,并且充当 这个原型链中的最后一个环节。
javascript 中字符串的值与原型松散耦合。如果将字符串的原型替换为空对象,则值不会发生变化。当您访问字符串时,您将获得完全相同的值。
关于原型,你已经有足够的答案是什么......我想你甚至知道它。
所以在你的例子中,你没有改变字符串本身,你注意到的被称为原始包装器对象
多核
例:
var a = 'A';
String.prototype.test = function() {
return this;
}
console.log('a primitive type =>', typeof a)
console.log('a primitive object wrapper type =>', typeof a.test());
是的,可以像其他对象一样向 String 原型添加新函数。
虽然值得看看JavaScript|MDN 字符串 只需从代码中删除调用即可。
法典:
var a = '';
String.prototype.hi = function(){
console.log('hi');
}
a.hi();