thomaseng
No Smoking , New Live !

导航

 

 在这个例子最后顺便谈一下我对new性能问题的理解

 

1.关于new的一个例子

//定义
function
F(){ } console.log( F.prototype );//看一下 F 的原形对象
F.prototype.id = 123;//在原形对象F.prototype中添加一个id属性 console.log( F.prototype );
var a = new F( ); //用操作符new 来调用方法 F()返回的是一个对象
console.log( a ); //对象a只有一个属性:__proto__ ,这个属性指向的是F.prototype

console.log( a.id ); //123 那么这个id哪来的,当然是 F 的属性 prototype 中的
var b = new F( );     //用操作符new 来调用方法 F()返回的是一个对象
console.log( b ); //对象b也只有一个属性:__proto__ ,这个属性指向的是F.prototype

console.log( b.id ); //123


b.__proto__.id = "tom";      //------改变id的值------//

console.log( a.id );//tom
console.log( F.prototype.id );//tom

//这说明了new 出来的对象a ,b 他们的__proto__都是指向同一个地址;
//这也提醒了我们任何时候改变prototype,都要进行全局考量。

 2.  我对new的性能问题的理解

    在讲到 new 的性能问题的时候,我看到有的博友讲:“ 通过 new 去调用函数,对象会持有一个无意义的原形对象, 这样会浪费资源 ”,根据上面的例子,__proto__会占用资源么?那么如果说是对CPU的影响,我个人觉得就没必 要考虑了 ^_^ 。

    那么我觉得可能的性能问题就是下面这种情况: 例如:var a=new F(),那么这样就会有一个原形链 a=>F.prototype=>....=>Object.prototype;

当我们在对A进行操作的时候,比如说找一个属性或者调用一个方法,那么如果在a中找不到就会顺着原型链一直往上找,最终一直找到Object.prototype为止,
在这中间走了一系列的 for in 循环遍历,可能的性能影响就是在这里;

    而如果说直接用字面量大括号 { } 创建一个对象,那么这个对象的__proto__ 直接指向的就是Object.prototype,遍历的次数就少了

 

posted on 2013-04-11 04:38  thomaseng  阅读(258)  评论(0编辑  收藏  举报