使用構造函數的主要問題,就是每個方法都要在實例上重新創建一遍。 探討構造函數內部的方法(或函數)的問題,首先看下兩個實例化後的屬性或方法是否相等。 方法的值相等,因為傳參一致可以把構造函數里的方法(或函數)用 new Function()方法來代替,得到一樣的效果,更加證明,他們最終判斷的是引用地址 ...
使用構造函數的主要問題,就是每個方法都要在實例上重新創建一遍。
探討構造函數內部的方法(或函數)的問題,首先看下兩個實例化後的屬性或方法是否相等。
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很可能沒有相應的屬性)。