为什么原型函数比默认声明函数慢40倍?

时间:2012-03-02 04:40:55

标签: javascript performance prototype

我玩过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

Here's a jsperf test case

P.S。我知道原型修改不是最好的情况,可以命名为'monkey patching':)

2 个答案:

答案 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?

String object versus literal - modifying the prototype?

答案 1 :(得分:1)

在使用猴子修补版本的JavaScript主体替换C /机器代码中实现的原始函数时,可能性非常好。