在这个例子最后顺便谈一下我对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,遍历的次数就少了