前端性能优化:创建对象二

既然使用var obj = { name1: name1, name2: name2, name3: name3 ,name4:name1+name2}; 方式是最快的,那么使用原型的方式会变快吗?

测试代码:

var length=30000;
/*构造函数创建对象*/
function mYObj(name1,name2,name3){
  this.name1=name1;
  this.name2=name2;
  this.name3=name3;
  this.name4=name1+name2;  
  this.name5=name1+name3;
  this.name6=name1;
  this.name7=name2;
  this.name8=name3;
}

/*工厂方法创建对象*/
function CreateObj1(name1,name2,name3)
{  
  var obj = { name1: name1, name2: name2, name3: name3 ,name4:name1+name2, name5:name1+name3,name6:name1,name7:name2,name8:name3}; 
   return obj;
}
function CreateObj2(name1,name2,name3)
{  
  var obj =new mYObj(name1,name2,name3); 
   return obj;
}

function Test1()
{
var date1=new Date().getTime();
  var t=[];
for(var i=0;i<length;i++)
{
 t[i]=CreateObj1(1,"name"+i,i+10);
}
var date12=new Date().getTime();
console.log("1Test"+((date12-date1)));
}

function Test2()
{
var date1=new Date().getTime();
  var t=[];
for(var i=0;i<length;i++)
{
 t[i]=CreateObj2(1,"name"+i,i+10);
}
var date12=new Date().getTime();
console.log("2Test"+((date12-date1)));
}

测试发现还是var obj = { name1: name1}这种方式速度快。

但如果创建的对象包含方法呢?

/*构造函数创建对象*/
function mYObj(name1,name2,name3){
  this.name1=name1;
  this.name2=name2;
  this.name3=name3;
  this.name4=name1+name2;  
  this.name5=name1+name3;
  this.name6=name1;
  this.name7=name2;
  this.name8=name3;
}
mYObj.prototype.fun1=function()
{
return this.name1+this.name2;
}
mYObj.prototype.fun2=function()
{
return this.name1+this.name2;
}
mYObj.prototype.fun3=function()
{
return this.name1+this.name2;
}
/*工厂方法创建对象*/
function CreateObj1(name1,name2,name3)
{  
  var obj = { name1: name1, name2: name2, name3: name3 ,name4:name1+name2, name5:name1+name3,name6:name1,name7:name2,name8:name3,fun1:function(){return this.name1+this.name2},
  fun2:function(){return this.name1+this.name2},fun3:function(){return this.name1+this.name2}}; 
   return obj;
}
测试发现,使用原型的方式创建对象变快了,而且随着对象包含方法越来越多,差别越来越大。因为方法没有共享,创建方法的代价很大,每一个对象都需要创建方法。

有没有方法改进呢?既然创建方法的代价很大,那就改进,是方法共享,改进如下

function fun1()
{
return this.name1+this.name2;
}
function fun2()
{
return this.name1+this.name2;
}
function fun3()
{
return this.name1+this.name2;
}
/*工厂方法创建对象*/
function CreateObj1(name1,name2,name3)
{  
  var obj = { name1: name1, name2: name2, name3: name3 ,name4:name1+name2, name5:name1+name3,name6:name1,name7:name2,name8:name3,fun1:fun1,
  fun2:fun2,fun3:fun3}; 
   return obj;
}

这样修改后,差别确实变小了,但原型的方式还是快,毕竟原型的方式不需要给这些方法赋值。其实在实际使用中,还是需要测试,根据实际情况进行修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值