在 JavaScript 中执行 OOP 的一种常见方法是使用带有附加函数的对象,而不是使用内置的原型、构造函数和new
运算符。Mixin 通常用于通过粘贴成员变量来组合 2 个对象,模拟继承。
衡量这种做法是否会对性能产生影响是很困难的,因为在这种情况下,具体的基准并不能说明太多。是否有这样的性能惩罚,它们有多严重?
在 JavaScript 中执行 OOP 的一种常见方法是使用带有附加函数的对象,而不是使用内置的原型、构造函数和new
运算符。Mixin 通常用于通过粘贴成员变量来组合 2 个对象,模拟继承。
衡量这种做法是否会对性能产生影响是很困难的,因为在这种情况下,具体的基准并不能说明太多。是否有这样的性能惩罚,它们有多严重?
如果您使用构造函数、原型、new
s 等进行 OOP,这是 V8(Chrome 和 Node.js 中的 JS 引擎)特别优化的东西。您的用户属性甚至会与其内部属性并排存储,例如在 C++ 或 Java 对象中。
用于调整 V8 的基准之一是高度面向对象的,例如http://octane-benchmark.googlecode.com/svn/latest/deltablue.js
如果你动态地附加属性或做一些其他低俗的技巧,你当然会混淆这个启发式方法,并且可能会让你自己退缩。
这当然是特定于引擎的。
我还应该提到一般免责声明,如果您正在执行诸如“单击处理程序显示文本区域”之类的 UI 代码,那么这无关紧要。您可能会收集每个方法调用的堆栈跟踪,而不会注意到任何性能问题。
如果您担心这一点,您可以混合使用原型,但正如 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