Javascript String.prototype.replace===String.replace

Javascript String.prototype.replace===String.replace,javascript,Javascript,当我使用call()或apply()时,我遇到了一个问题 console.log(String.prototype.replace === String.replace);//false 我认为String.replace应该与String.prototype.replace相等,因为它们是相同的对象 但是,它们是不同的 当我运行下面的代码时会发生什么: var s = "a b c"; String.replace.call(s,'a','A');//return "a" 为什么这段代码

当我使用
call()
apply()
时,我遇到了一个问题

console.log(String.prototype.replace === String.replace);//false
我认为
String.replace
应该与
String.prototype.replace
相等,因为它们是相同的对象

但是,它们是不同的

当我运行下面的代码时会发生什么:

var s = "a b c";
String.replace.call(s,'a','A');//return "a" 
为什么这段代码不抛出一个错误,但返回一个值?

这将是真的:

(new String()).replace === String.prototype.replace
这不会:

String.prototype.replace === String.replace
String
是一个构造函数,这只是一个函数

String.prototype
是一个对象,使用
new String()
创建的其他对象将在其中搜索属性(如果它们没有属性)

new String()
创建一个新对象。考虑这一点:

var s = new String();
s.replace(...);

实际上,
s
没有替换方法。根据其构造函数的原型,这就是为什么调用此方法会成功的原因

替换方法的语法是
string.replace()
,其中
string
必须是字符串,而不是字符串对象。

看看这个JSFIDLE。至少在chrome中,这些是不同的

String.replace()将第一个参数作为要搜索替换的字符串,然后使用其余参数,并使用method.apply将其压缩到String.prototype.replace()中

编辑:

根据您的评论了解更多详细信息

String.replace()

String.prototype.replace()


这就是我上面的JSFIDLE在Chrome控制台中呈现的内容

我认为这里有很多混杂的信息。首先,我们必须澄清
String
构造函数

因此,无论Firefox中的
String.replace是什么,它都是非标准的,因此您应该远离它。显示
String.replace
确实不存在

不幸的是,我无法告诉您
String.replace
在Firefox中来自何处。没有提到。但它似乎不是继承的属性,因为
String.hasOwnProperty('replace')
返回
true


现在谈谈你问题中的几点:

我认为
String.replace
应该与
String.prototype.replace
相等,因为它们是相同的对象

显然不是。如果是,则返回
true
。另外:
String!==String.prototype

字符串实例使用的
replace
方法是
string.prototype.replace
。因此,如果您想使用
调用
应用
,您可以使用此方法对它们进行修改

为什么这段代码不抛出一个错误,但返回一个值

为了回答这个问题,我们必须知道这个方法在做什么。也许看看Firefox或Spidermonkey源代码可以提供一些信息


如果您对原型继承的工作原理感到困惑,请查看-和。

原型内部显然有一些增强,因为它通常返回相同的结果…
String.replace.call(s,'a','a')抛出错误,因为它不是函数。如果执行
String.replace而不执行
()
,会发生什么情况?你得到了什么代码?@pimvdb我在firefox中运行这些代码,String.replace返回函数replace(){[native code]}。此外,它不会抛出错误。String对象是有效的,但是
String.replace
不存在。所以
String.replace==undefined
。你错了。在您的小提琴中,
String.replace
是由Mootools添加的方法。看看这个不包含任何库的提琴:我错了,我知道它不是核心框架的一部分,所以我认为它是Chrome添加的东西,因为那是我使用的浏览器
function (item){
    return method.apply(item, slice.call(arguments, 1));
}
function replace() { [native code] }