-1

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

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

4

2 回答 2

2

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

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

如果你动态地附加属性或做一些其他低俗的技巧,你当然会混淆这个启发式方法,并且可能会让你自己退缩。

这当然是特定于引擎的。

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

于 2013-09-19T03:53:29.433 回答
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
于 2013-09-19T15:56:29.517 回答