我玩过jsperf.com,发现prototyped函数比“默认”声明的函数强40倍。
String.prototype.contains = function(s){ return !!~this.indexOf(s) }
= 220K ops / s
VS
function isContains(str, s) { return !!~str.indexOf(s) }
= 8.5KK ops / s
P.S。我知道原型修改不是最好的情况,可以命名为'monkey patching':)
答案 0 :(得分:6)
我认为它很慢,因为每次调用一个方法时,字符串原语会自动用一个临时对象包装。
这也解释了new Object("hi").foo()
对"hi".foo()
的性能提升。
来自MDN docs:
字符串文字(用双引号或单引号表示)和从非构造函数上下文中的String调用返回的字符串(即,不使用new关键字)是原始字符串。 JavaScript自动转换基元和String对象,因此可以对原始字符串使用String对象方法。在要在原始字符串上调用方法或发生属性查找的上下文中,JavaScript将自动包装字符串原语并调用方法或执行属性查找。
附近:
Why can't I add properties to a string object in javascript?
答案 1 :(得分:1)
在使用猴子修补版本的JavaScript主体替换C /机器代码中实现的原始函数时,可能性非常好。