繁体   English   中英

String.prototype.replace === String.replace

[英]String.prototype.replace === String.replace

当我使用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没有替换方法。 通过其构造函数的原型,这就是为什么调用此方法将成功的原因。

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

看看这个jsfiddle http://jsfiddle.net/GmFmR/ 至少在铬中是不一样的。

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

编辑:

根据您的评论获取更多详细信息

String.replace()

function (item){
    return method.apply(item, slice.call(arguments, 1));
}

String.prototype.replace()

function replace() { [native code] }

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

我认为这里有很多混杂的信息。 首先,我们必须阐明String构造函数没有replace方法

因此,无论Firefox中的String.replace是什么,它都是非标准的,因此您应该远离它。 在Chrome中进行的快速测试表明,那里确实不存在String.replace

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


现在到您的问题的几点:

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

显然他们不是。 如果是,它将返回true 另外: String !== String.prototype

字符串实例使用的replace方法是String.prototype.replace 因此,如果您要使用callapply ,则可以使用此方法。

为什么此代码不引发错误,但返回值?

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

如果您对原型继承的工作方式感到困惑,请查看《 MDN JavaScript指南 - 对象模型继承的 详细信息》

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM