String.prototype.replace === String.replace

时间:2011-10-18 13:07:25

标签: 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" 

为什么这段代码不会抛出错误,而是返回一个值?

4 个答案:

答案 0 :(得分:0)

这是真的:

(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没有替换方法。通过它的构造函数的原型,这就是为什么调用这个方法会成功的。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

看看这个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控制台中呈现的内容。

答案 3 :(得分:0)

我认为这里有很多混合信息。首先,我们必须澄清String构造函数does not have a replace method

因此,无论Firefox中的String.replace是什么,它都是非标准的,因此您应该远离它。 A quick test in Chrome表明String.replace确实不存在。

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


现在问题中的一些要点:

  

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

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

字符串实例使用的replace方法是String.prototype.replace。因此,如果您想使用callapply,请使用此方法。

  

为什么这段代码不会抛出错误,而是返回一个值?

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

如果您对原型继承的工作原理感到困惑,请查看MDN JavaScript Guide - Details of the object modelInheritance revisited