js原型繼承的幾種方式


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;                //指定對象
}

我只知道這幾種而且還有的沒搞懂。。。。好尷尬=。=


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM