在JavaScript中执行OOP的一种常见方法是使用附加了函数的对象,而不是使用内置原型,构造函数和new
运算符。 Mixins通常用于通过粘贴成员变量来组合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