2011-08-22 125 views
0

我承担了http://jsperf.com/literal-obj-vs-function-obj这个测试和FF6,Opera 10的,IE8 文字胜,但功能方法在Chrome 13.0.782.112更快,所以使用哪一个更好的方法?文本对象和函数的构造

var A = { 
    aa : function(){ 
     var i, j=[]; 
     var arr = ['Literal', 'Function']; 
     for (i = 0; i < arr.length; i++){ 
      j[i] = arr[i]; 
     } 
     return j[0]; 
    } 
}; 
var A1 = A; 
var A2 = A1; 
A1.foo = ' Test'; 
alert(A1.aa() + A2.foo); 

//Function test 
function B(){ 
    this.bb = function(){ 
     var i, j=[]; 
     var arr = ['Literal', 'Function']; 
     for (i = 0; i < arr.length; i++){ 
      j[i] = arr[i]; 
     } 
     return j[1]; 
    } 
} 
var B1 = new B(); 
var B2 = new B(); 
B.prototype.foo = ' Test'; 
alert(B1.bb() + B2.foo); 

回答

1

要告诉你实话,我已经找到了最好的是混合:

function C() { 
    var i, j = [], 
     foo; 

    return { 
     bb: function() { 

      var arr = ['Literal', 'Function']; 
      for (i = 0; i < arr.length; i++) { 
       j[i] = arr[i]; 
      } 
      return j[1]; 
     }, 
     setFoo: function(val) { 
      foo = val; 
     }, 
     getFoo: function() { 
      return foo; 
     } 
    } 
} 
var C1 = C(); 
var C2 = C(); 
C2.setFoo(' Test'); 
console.log(C1.bb(), C2.getFoo()); 
+0

我检查和测试你的修订jsperf,当然是一个不错的方法,但我认为文字是一个很好的选择,就像在Crockford的Bonus Advice http://javascript.crockford.com/code.html中一样 – Kitty

1

无论你喜欢哪一个。速度永远不应该成为一个问题,除非它成为您的应用程序中的真正问题。你在做什么看起来像是对我来说过早的优化,这是浪费时间。等到你需要优化你的代码,然后优化需要返工的零件。这是微不足道的。

0

Chrome使用名为hidden classes的优化,允许它更快地访问对象成员。

我敢打赌,只有在通过new构造对象时,才会启用此优化,因此通过new构造的对象比通过new构造的对象具有更快的成员访问权限。

+0

你说得对,这个视频解释它http://www.youtube.com/watch?v=hWhMKalEicY – Kitty

0

好吧,铬根据wikipedia有约17%的市场份额。所以使用文字。

0

我怀疑你会做什么足够密集的差异关系。

函数样式构造函数给你选择私有变量,这很好。