??
?? javascript 是一種基于原型的語言,沒有顯示的繼承符號,它有2種隱式的方式可以實現面向對象中的繼承:
???1 .???在子類中顯示的調用父類的構造函數.
??????????例子:
??????????????function? parent ()
?????????????{
????????????????????this.first = parentFirst;
????????????????????this.second = parentSecond;?
??????????????}
????????????? function child()
??????????????{
?????????????????????this.inherrit = parent;
?????????????????????this.inherrit();
?????????????????????this.second = childSecond;
????????????}
????????????? function parentFirst()
???????????{
??????????????????alert(" parent First method call !");
????????????}
???????????function parentSecond()
????????????{
??????????????????alert(" parent second method call !");
????????????}
??????????? function childFirst()
????????????{
??????????????????alert("child first method call !");
????????????}
????????????function childSecond()
????????????{
??????????????????alert("child second method call !");
????????????}
????????????function? printClass()
????????????{
??????????????????var?newObj = new child();
????????????????? newObj.first();
??????????????????newObj.second();
????????????}
????????????printClass();
?????????????發現最后打印出來結果是 parent first method call !?? child second method????call !
??????????我們可以看到,first 和second 方法最先在parent類中定義,在child類中 second方法又被重載了.child類的構造函數的前2行的作用就是做了一個簡單的原始繼承操作.
先把parent的原型賦給child的inherrit方法,執行完parent的構造函數后parent的屬性就全在child的屬性列表里了.因為child中是用this來調用parent的構造函數的,javascript解釋器會把parent中的this,child中的this 理解成一個作用域下的this,所以就產生了繼承效果.
? 2.???繼承的第二種方式:? prototype方式.
??????? 把父類對象賦給 子類的prototype屬性.
??????? 把我們的子類改一下:
????????function child()
????????{
?????????????????????this.second = childSecond;
?????????}
?????????加入?? child.prototype = new?parent;這一行語句,執行,發現和第一種方式得到同樣的結果.
??????? 用prototype 方式繼承比調用構造函數方式更靈活.用prototype方式可以實現動態繼承,比如你用prototype方式給父類動態增加一個屬性或者方法,那么子類自動就會獲得這個屬性或者方法.??
???????????在javascript中你可以隨意的給對象增加屬性或者方法,但是當你給一個實例化的對象增加屬性的時候,這個增加的屬性只屬于這個實例,例如:
?? var newClass = new subClass();
? newClass.addprop = "新增屬性";
如果想為該類的所有實例都增加一個屬性或者方法,要用prototype,? 例子
?? var newClass = new child();
? child.prototype.addprop = "新增屬性";
? 這樣newClass里就會有addprop這個屬性了.
這也是我們給javascript內部對象增加屬性或者方法的方式,比如 String.prototype.toString={return "aaa";},不過javascript的內部對象的prototype屬性都是只讀的,所以只能增加內部對象的屬性,不能修改.
????? 突然感覺倒?prototype,用處原來如此之多,上邊寫的不過是其中一小步分啊.
??
posted on 2006-08-09 17:30
鄧兵野 閱讀(1349)
評論(1) 編輯 收藏 所屬分類:
javascript