JS面向?qū)ο螅ɡ^承)

1.什么繼承?

繼承就是某個(gè)對(duì)象可以訪問(wèn)另一個(gè)對(duì)象的屬性和方法,我們認(rèn)為他們之間存在繼承關(guān)系。

舉例:


function Chinese(){}

var jack=new Chinese();

//jack可以訪問(wèn)到自身的屬性,還可以訪問(wèn)到Chinese.prototype對(duì)象中的屬性和方法,

//--->我們說(shuō)jack繼承自Chinese.prototype

//--->jack.__proto__===Chinese.prototype

2.繼承主流的實(shí)現(xiàn)方式:

1.原型式繼承

a.擴(kuò)展原型對(duì)象

 function Person(){}
    //一個(gè)函數(shù)創(chuàng)建好之后,就會(huì)又一個(gè)默認(rèn)的原型對(duì)象,需要給這個(gè)對(duì)象添加屬性、方法,我們把這樣的方式稱(chēng)之為擴(kuò)展原型對(duì)象實(shí)現(xiàn)繼承
    Person.prototype.run=function(){
        console.log("run");
    };
    var p1=new Person();
    console.log(p1.constructor);//Person
    //p1
    //p1.__proto__--->Person.prototype
    console.log(p1.run);
    //有時(shí)候我們需要給原型對(duì)象中擴(kuò)展多個(gè)屬性和方法,如果使用擴(kuò)展原型對(duì)象來(lái)實(shí)現(xiàn),出現(xiàn)一些重復(fù)的代碼,我們思考能不能把這些重復(fù)封裝起來(lái),解決方案:替換原型對(duì)象實(shí)現(xiàn)繼承
    Person.prototype.run1=function(){
        console.log("run");
    };
    Person.prototype.run2=function(){
        console.log("run");
    };
    Person.prototype.run3=function(){
        console.log("run");
    };
    Person.prototype.run4=function(){
        console.log("run");
    };
    Person.prototype.run5=function(){
        console.log("run");
    };

b.替換原型對(duì)象

    function Person(){}
    //一個(gè)函數(shù)創(chuàng)建好之后,就會(huì)又一個(gè)默認(rèn)的原型對(duì)象,需要給這個(gè)對(duì)象添加屬性、方法,我們把這樣的方式稱(chēng)之為擴(kuò)展原型對(duì)象實(shí)現(xiàn)繼承

    //替換原型對(duì)象
    Person.prototype={
        constructor:Person,
        r1:function(){},
        r2:function(){},
        r3:function(){}
    };

    var p1=new Person();
    console.log(p1.r1);//p1.__prpto__:Person.prototype

2.混入繼承(拷貝繼承)

function foo(name,age,gender,height,width,language,color){}

    foo("zhangsan",20,"男",180,180,"中文","黃色");

    function foo2(obj){
        this.name=obj.name;
        this.age=obj.age;
        this.gender=obj.gender;
        this.height=obj.height;
        this.language=obj.language;
        this.width=obj.width;
        this.color=obj.color;

        //上面的代碼又產(chǎn)生了很多的重復(fù)的字符,就希望有某種方式可以減少重復(fù)
        //解決方案:混入繼承:for...in循環(huán)
        for (var key in obj) {//key保存了obj中每一個(gè)屬性的名稱(chēng):字符串的值
            //獲取指定屬性的值:
            this[key]=obj[key];//舉例:this["name"]=obj["name"]
        }
    }
    foo2({
        name:"zhagnsan",age:18,
        gender:"男",height:180,width:200,language:"英語(yǔ)",
        color:"白色"
    });


    /**
     * 將某個(gè)對(duì)象中的屬性分別拷貝到另一個(gè)對(duì)象中
     * 把提供數(shù)據(jù)的對(duì)象稱(chēng)之為數(shù)據(jù)源對(duì)象(source object)
     * 把接收數(shù)據(jù)的對(duì)象稱(chēng)之為目標(biāo)對(duì)象(target object)
     */
    function mixin(target,source){
        for (var key in source) {
            //將source中的指定的屬性拷貝到target中-->給target添加同名屬性
            target[key]=source[key];
        }

        //告訴用戶(hù)拷貝的結(jié)果:
        return target;
    }

    var o1={name:"zhagnsan",age:25,gender:"男"};
    var o2={};
    console.log(mixin(o2,o1));

    var o3={name:"zhagnsan",age:25,gender:"男"};
    var o4={length:10,gender:"女"};
    console.log(mixin(o4,o3));//o4-->{name:"zhangsan",age:25,gender:"男",length:10}

3.原型式繼承(經(jīng)典繼承)

 //原型式繼承:經(jīng)典繼承-->由道格拉斯在蝴蝶書(shū)(javascript語(yǔ)言精粹)中提出

    function mixin(target,source){
        for (var key in source) {
            //將source中的指定的屬性拷貝到target中-->給target添加同名屬性
            target[key]=source[key];
        }

        //告訴用戶(hù)拷貝的結(jié)果:
        return target;
    }
    var o3={name:"zhagnsan",age:25,gender:"男"};
    var o4={length:10,gender:"女"};

    //希望o4中可以訪問(wèn)到length/gender:"女"/-->name/age
    //實(shí)現(xiàn)思路:讓o3和o4之間產(chǎn)生某個(gè)聯(lián)系(繼承關(guān)系)
    //      -->o4繼承自o3
    //      -->o4.__proto__==o3     -->o4就不僅可以訪問(wèn)到自己的屬性,也可以正常訪問(wèn)到o3的一些屬性

    //不能直接使用:o4.__proto__==o3,因?yàn)開(kāi)_proto__屬性是非標(biāo)準(zhǔn)屬性,具有瀏覽器兼容性問(wèn)題
    //曲線救國(guó)的方式:
    //想到之前:function Person(){}   var p1=new Person();  p1.__proto__===Person.prototype

    //為了實(shí)現(xiàn)上面的關(guān)系,需要進(jìn)行相關(guān)的轉(zhuǎn)換,也就是通過(guò)某個(gè)構(gòu)造函數(shù)創(chuàng)建一個(gè)實(shí)例o4,執(zhí)行構(gòu)造函數(shù)的原型指向o3
    function F(){}
    F.prototype=o3;//讓F的實(shí)例都可以訪問(wèn)到o3中的屬性
    var o5=new F();//o5.__proto__===o3
    o5.length=10;
    o5.gender="女";

    console.log(o5.length);//自己的length
    console.log(o5.gender);//自己的gender
    console.log(o5.name);//自己沒(méi)有,訪問(wèn)o3的name屬性

    //總結(jié):
    //原型式繼承的功能:創(chuàng)建一個(gè)新的對(duì)象,讓新的對(duì)象可以繼承自指定的對(duì)象,從而這個(gè)新的對(duì)象既可以訪問(wèn)到自己的屬性,也可以訪問(wèn)到指定的對(duì)象的屬性

    //現(xiàn)代瀏覽器中:Object.create()實(shí)現(xiàn)了原型式繼承(經(jīng)典繼承)
    //ES5(js語(yǔ)言規(guī)范的第五個(gè)版本)——Object.create()--->IE9以下不支持
    //var o6=Object.create(o3);//o6繼承自o3



    //如果希望寫(xiě)出一段代碼,實(shí)現(xiàn)原型式繼承,讓它可以兼容所有的瀏覽器

    //執(zhí)行過(guò)程:首先判斷瀏覽器是否存在這個(gè)方法,如果不存在,這個(gè)瀏覽器自己沒(méi)有實(shí)現(xiàn)經(jīng)典繼承,就幫他實(shí)現(xiàn)
    //                              如果已經(jīng)存在,就不需要進(jìn)行任何操作
    //經(jīng)過(guò)上面的處理之后,就實(shí)現(xiàn)了可以在任意瀏覽器版本中,可以調(diào)用Object.create()
    if(!Object.create){
        Object.create=function(parent){
            function F(){}
            F.prototype=parent;
            return new F();
        };
    }
    alert(Object.create.toString());

    var o7=Object.create(o3);//o6繼承自o3
    alert(o7.name);


4.借用構(gòu)造函數(shù)繼承

5.寄生繼承、寄生組合、組合繼承

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.繼承(接口繼承和實(shí)現(xiàn)繼承) 繼承是 OO 語(yǔ)言中的一個(gè)最為人津津樂(lè)道的概念。許多 OO 語(yǔ)言都支持兩種繼承方式...
    believedream閱讀 1,059評(píng)論 0 3
  • js中的this:當(dāng)前觸發(fā)事件的對(duì)象(元素)觸發(fā)這個(gè)函數(shù)的對(duì)象(看上下文)js中怎么創(chuàng)造對(duì)象:var obj=ne...
    BrightenSun閱讀 2,565評(píng)論 0 5
  • 本章內(nèi)容 理解對(duì)象屬性 理解并創(chuàng)建對(duì)象 理解繼承 面向?qū)ο笳Z(yǔ)言有一個(gè)標(biāo)志,那就是它們都有類(lèi)的概念,而通過(guò)類(lèi)可以創(chuàng)建...
    悶油瓶小張閱讀 965評(píng)論 0 1
  • 1、//call繼承 } 2、//原型繼承 3、//組合繼承 4、//冒充繼承
    Simon_s閱讀 307評(píng)論 0 0
  • 嫁個(gè)老公等受氣 家公家婆最冤氣 兒女不聽(tīng)真激氣 做個(gè)女人好谷氣 生活艱難不景氣 大霧迷蒙又濕氣 何日云開(kāi)見(jiàn)朝氣 見(jiàn)...
    芬芳花草的香味閱讀 306評(píng)論 0 0

友情鏈接更多精彩內(nèi)容