当我使用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"
为什么这段代码不会抛出错误,而是返回一个值?
答案 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
。因此,如果您想使用call
或apply
,请使用此方法。
为什么这段代码不会抛出错误,而是返回一个值?
为了回答这个问题,我们必须知道该方法正在做什么。也许看看Firefox或Spidermonkey源提供了一些信息。
如果您对原型继承的工作原理感到困惑,请查看MDN JavaScript Guide - Details of the object model和Inheritance revisited。