2011-10-18 33 views
1

当我使用call()apply()时,出现问题。String.prototype.replace === String.replace

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" 

为什么没有这个代码抛出一个错误,但返回一个值?

+2

问题是..? –

+0

在原型内部显然有一些增强,只是因为它通常会返回相同的结果... – Tules

+0

'String.replace.call(s,'a','A');'抛出一个错误,因为它不是一个函数。如果不用'()'执行'String.replace',会发生什么?你获得什么代码? – pimvdb

回答

0

我认为这里有很多混杂的信息。首先我们要澄清String构造函数的功能does not have a replace method

所以,无论String.replace是在Firefox中,它是非标准的,因此你应该远离它。 A quick test in Chrome显示String.replace确实不存在。

不幸的是,我不能告诉你在哪里String.replace来自Firefox。 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

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

0

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

+0

为什么这些代码不会抛出错误?但返回一个值? – ray

+1

String对象有效,但是'String.replace'不存在。所以'String.replace == undefined'。 – Dennis

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控制台呈现。

+0

你能告诉我更多细节吗? – ray

+0

你错了。在你的小提琴中,'String.replace'是Mootools添加的一种方法。看看这个不包含任何库的小提琴:http://jsfiddle.net/GmFmR/1/ –

+0

我的错误,我知道它不是核心框架的一部分,所以我认为这是Chrome添加的东西,因为是我使用的浏览器 –