使用带有函数和mixins的对象而不是原型有几个性能损失?

时间:2013-09-19 03:39:48

标签: javascript performance oop

在JavaScript中执行OOP的一种常见方法是使用附加了函数的对象,而不是使用内置原型,构造函数和new运算符。 Mixins通常用于通过粘贴成员变量来组合2个对象,模拟继承。

衡量这种做法是否会对绩效产生影响很难,因为在这种情况下,具体的基准并不能说明多少。是否有这样的性能惩罚,以及它们有多严重?

2 个答案:

答案 0 :(得分:2)

如果你使用构造函数,原型,new等进行OOP,这就是V8(Chrome和Node.js中的JS引擎)特别优化的东西。您的用户属性甚至可以与其内部属性并排存储,例如在C ++或Java对象中。

用于调整V8的基准之一是面向对象,如http://octane-benchmark.googlecode.com/svn/latest/deltablue.js

如果你动态附加属性或做一些其他的诡计,你当然会混淆这种启发式方法,并可能让你自己回归。

这当然是引擎特定的。

我还应该提到一般免责声明,如果你正在做像“点击处理程序显示文本区域”这样的UI代码,那么这无关紧要。您可以在每次方法调用时收集堆栈跟踪,而不会注意任何性能问题。

答案 1 :(得分:1)

如果你担心这一点,你可以混合原型,但正如Bergi所说;当多次调用一个方法时,如果你在实例上有方法而不是它的原型,它实际上有一个较短的查找。

以下是如何在原型上进行混音:

function mixin(source, target){
  for(thing in source){
    if(source.hasOwnProperty(thing)){
      target[thing]=source[thing];
    }
  }
};
var canSpeak = function(){
  //initialize instance specific values
  this.canSpeakMessage="Hello World";
  this.someArrayThatNeedsToBeInitialized=[];
};
canSpeak.prototype.speak = function(){
  console.log(this.canSpeakMessage);
}
var Test= function(){
  //init instance specific values for canSpeak
  canSpeak.apply(this,arguments);
};
mixin(canSpeak.prototype,Test.prototype);


var t = new Test();
t.speak();//=Hello World