Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用字符串向其添加方法';当原型是不可变的时,它是什么?_Javascript_String_Immutability - Fatal编程技术网

Javascript 如何使用字符串向其添加方法';当原型是不可变的时,它是什么?

Javascript 如何使用字符串向其添加方法';当原型是不可变的时,它是什么?,javascript,string,immutability,Javascript,String,Immutability,字符串是不可变的,这意味着我们只能读取它的属性,不能修改、创建或删除任何属性或方法。所以基本上字符串是冻结的 我的问题是如何向字符串原型添加新方法 var a=''; String.prototype.hi=函数(){ console.log('hi'); } a、 您好()是的,可以像其他对象一样向字符串原型添加新函数 虽然这是值得一看的信息,目前在网上 只需从代码中删除调用 代码: var a = ''; String.prototype.hi = function(){ console.

字符串是不可变的,这意味着我们只能读取它的属性,不能修改、创建或删除任何属性或方法。所以基本上字符串是冻结的

我的问题是如何向字符串原型添加新方法

var a='';
String.prototype.hi=函数(){
console.log('hi');
}

a、 您好()
是的,可以像其他对象一样向字符串原型添加新函数

虽然这是值得一看的信息,目前在网上 只需从代码中删除调用

代码:

var a = '';
String.prototype.hi = function(){
console.log('hi'); 
}
a.hi();
字符串是不可变的,这意味着我们只能读取它的属性,不能修改、创建或删除任何属性或方法


事实并非如此。字符串不可变意味着字符串对象本身被冻结。这并不意味着作为一个单独对象的
String.prototype
被冻结。当我们向
String.prototype
对象添加属性时,这并不意味着我们对任何字符串进行了变异。它只是另一个对象,而不是字符串本身。

string
在Javascript中是不可变的,它是一个true语句。所以,你是对的。 因此,字符串的值是不可变的,但不是
prototype
。字符串从其父对象继承了原型。原型中可用的函数不修改string的值,而是返回string的新实例

说到继承,JavaScript只有一个结构: 物体。每个对象都有一个私有属性,该属性包含指向的链接 另一个物体叫做它的原型。这个原型对象有一个 它自己的原型,依此类推,直到到达一个带有null的对象 作为它的原型。根据定义,null没有原型,充当 这个原型链的最后一个环节


javascript中字符串的值与原型松散耦合。如果将字符串的原型替换为空对象,则值不会发生更改。当您访问字符串时,您将得到与字符串完全相同的值。

关于prototype,您已经有足够的答案了它是什么…您甚至知道它

因此,在您的示例中,您没有对字符串本身进行变异,您注意到的是

例如:

var a='a';
String.prototype.test=函数(){
归还这个;
}
log('a基元类型=>',a的类型)

log('a primitive object wrapper type=>',typeof a.test())函数
添加到
原型
不是一个好的做法函数总是添加到原型中@CodeManiac@Liam这仍然不是一种好的做法(除非是针对多边形填充进行的)。请看,当您说String是不可变的时,它实际上意味着String类的实例是不可变的。但是您仍然可以将静态函数添加到
String
class@CodeManiac是的,你是对的,但我举个例子来证明我的怀疑,以便更好地理解。是的,这是可能的,但为什么和如何?。因为String是不可变的,这与任何其他object不同。所有String方法都返回一个新字符串,而不是修改实际的字符串。我们不能简单地修改它的值,而是修改原型。而且,字符串不是javascript中唯一不变的东西。