如何在字符串不可变时使用其原型将方法添加到字符串中?



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();

最新更新