使用构造函数的主要问题,就是每个方法都要在实例上重新创建一遍。
探讨构造函数内部的方法(或函数)的问题,首先看下两个实例化后的属性或方法是否相等。
1 var box1=new Box('Lee',100); //传递一致 2 var box2=new Box('Lee',100); //同上 3 alert(box1.name==box2.name); //true,属性的值相等 4 alert(box1.run==box2.run); //false,方法其实也是一种引用地址 5 alert(box1.run()==box2.run()); //true,
方法的值相等,因为传参一致可以把构造函数里的方法(或函数)用 new Function()方法来代替,得到一样的效果,更加证明,他们最终判断的是引用地址唯一性。
1 function box(name,age){ 2 this.name=name; 3 this.age=age; 4 this.run=newFunction("return this.name+this.age+'运行中...'"); 5 //new Function()唯一性 6 }
我们可以通过构造函数外面绑定同一个函数的方法来保证引用地址的一致性,但这种做法没什么必要,只是加深学习了解:
1 function Box(name,age){ 2 this.name=name; 3 this.age=age; 4 this.run=run; 5 } 6 7 function run(){ 8 //通过外面调用,保证引用地址一致 9 return this.name+this.age+'运行中...'; 10 }
虽然使用了全局的函数 run()来解决了保证引用地址一致的问题,但这种方式又带来了一个新的问题,全局中的 this 在对象调用的时候是 Box 本身,而当作普通函数调 用的时候,this又代表 window(而window很可能没有相应的属性)。