我玩过jsperf.com,发现原型函数比"默认"声明的函数慢40倍。
String.prototype.contains = function(s){ return !!~this.indexOf(s) }
=220K ops/s
与。
function isContains(str, s) { return !!~str.indexOf(s) }
=8.5KK操作/s
下面是一个jsperf测试用例
附言:我知道原型修改不是最好的情况,可以称为"猴子补丁":)
我认为它很慢,因为每次调用方法时,字符串基元都会自动包装一个临时对象。
这也解释了new Object("hi").foo()
相对于"hi".foo()
的性能提升。
来自MDN文档:
字符串文字(用双引号或单引号表示)和在非构造函数上下文中从String调用返回的字符串(即,不使用new关键字)是基元字符串。JavaScript自动转换基元和String对象,因此可以对基元字符串使用String对象方法。在对基元字符串调用方法或进行属性查找的上下文中,JavaScript将自动包装字符串基元并调用该方法或执行属性查找。
附近:
为什么可以';是否在javascript中为字符串对象添加属性?
字符串对象与文字-修改原型?
在monkey补丁版本中,用JavaScript主体替换C/machine代码中实现的基元函数的几率非常高。