2011-02-23 73 views
1

这些模式的效率是否比其他模式更高或更低?对象的内存效率

模式1:

var jso = new Class({ 
    initialize: function() { 
    // code 
    }, 
    hiliteField: function() { 
    // code 
    } 
}); 

图案2:

var jso = new Class({ 
    initialize: function() { 
    this.hiliteField = hiliteField.bind(this); 
    // code 
    } 
}); 
var hiliteField = function() { 
    // code 
} 
+1

检查http://www.aminutewithbrendan.com/pages/20110216 – arian 2011-02-24 17:58:22

+0

感谢您的链接!它让我意识到这一点:http://jsperf.com/closure-vs-prototype-speed,这给了我一个更好的概念,即如何真实地对这个概念进行基准测试。我喜欢讨论,但我认为他们倾向于使用不现实的简单对象来进行测试。我可以使用我的实际对象重现测试,这些对象具有指数级更高的复杂性,并且具有特定于我的项目的实际基准。所有人都有美好的时光。 – 2011-02-24 18:39:44

回答

1

有多种方法来说是外部的类和向上的范围链,而不是类为“命名空间”方法的背后不能更好,艾莫。

不喜欢的图案#2有以下几个原因:

  • 可管理性 - 具有结合各外部函数到类的引用将是很难做到的。
  • 可读性 - 必须指出哪个函数正在被哪个类使用,这是一项任务
  • 可扩展性 - 因为函数不在jso类的原型中,扩展了jso的类或者将它用作mixin,不能访问外部方法。

话虽这么说,从存储的角度来看 - 因为它在每一个实例定义一次的原型,而不是单独只是做一个测试,但我要说,模式1是可能有小的开销。

+0

即使#2的内存占用量较小,它也会被每个类实例化中绑定所有这些函数的CPU使用率增加所抵消。编辑:我想这个评论应该已经在问题中,而不是这个答案:) – gonchuki 2011-02-23 15:49:40

1

模式2将使用更多的内存!这是基本的prototypal inheritance

为什么?在模式1中,jso的每个实例将参考jsoInstanceX.hiliteFieldjso.prototype.hiliteField。阅读:hiliteField将不会被复制,它只会存在于jso.prototype

在模式2中,每次指定hiliteField.bind(this);时都会创建一个函数包装。额外的内存不多,但速度也较慢,特别是对类初始化有影响。