1. 原型鏈繼承
2,構造函數繼承(對象冒充繼承)
3,組合繼承(原型鏈繼承+構造函數繼承)
4,原型式繼承
5. 寄生組合式繼承
一。原型鏈繼承
function Show(){ this.name="run"; } function Run(){ this.age="20"; //Run繼承了Show,通過原型,形成鏈條 } Run.prototype=new Show(); var show=new Run(); alert(show.name)//結果:run
二。構造函數繼承(對象冒充繼承)
為了解決引用共享和超類型無法傳參的問題,我們采用一種叫借用構造函數的技術,或
者成為對象冒充(偽造對象、經典繼承)的技術來解決這兩種問題
function Box(age){ this.name=['Lee','Jack','Hello'] this.age=age; } function Desk(age){ Box.call(this,age); //對象冒充,給超類型傳參 } var desk = new Desk(200); alert(desk.age);//200 alert(desk.name);//['Lee','Jack','Hello'] desk.name.push('AAA'); //添加的新數據,只給 desk alert(desk.name)//['Lee','Jack','Hello','AAA']
三。組合繼承(原型鏈繼承+構造函數繼承)
借用構造函數雖然解決了剛才兩種問題, 但沒有原型, 復用則無從談起。 所以, 我們需
要原型鏈+借用構造函數的模式,這種模式成為組合繼承。
function Box(age) { this.name = ['Lee', 'Jack', 'Hello'] this.age = age; } Box.prototype.run = function () { return this.name + this.age; }; function Desk(age) { Box.call(this, age); //對象冒充 } Desk.prototype = new Box(); //原型鏈繼承 var desk = new Desk(100); alert(desk.run());
四。原型式繼承
這種繼承借助原型並基於已有的對象創建新對象,
同時還不必因此創建自定義類型
function obj(o) { //傳遞一個字面量函數 function F() {} //創建一個構造函數 F.prototype = o; //把字面量函數賦值給構造函數的原型 return new F(); //最終返回出實例化的構造函數 } var box = { //字面量對象 name : 'Lee', arr : ['哥哥','妹妹','姐姐'] }; var box1 = obj(box); //傳遞 alert(box1.name); box1.name = 'Jack'; alert(box1.name); alert(box1.arr); box1.arr.push('父母'); alert(box1.arr); var box2 = obj(box); //傳遞 alert(box2.name); alert(box2.arr); //引用類型共享了
五。寄生組合式繼承
寄生組合式繼承解決了兩次調用的問題,組合式繼承就會有兩次調用的情況
基本模型如下:
function object(o) { function F() {} F.prototype = o; return new F(); } function inheritPrototype(subType, superType) { var prototype = object(superType.prototype); //創建對象 prototype.constructor = subType; //增強對象 subType.prototype = prototype; //指定對象 }
我只知道這幾種而且還有的沒搞懂。。。。好尷尬=。=