溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

javascript的對(duì)象繼承有幾種方法?

發(fā)布時(shí)間:2020-05-23 09:55:54 來(lái)源:億速云 閱讀:289 作者:Leah 欄目:web開(kāi)發(fā)

javascript的對(duì)象繼承有幾種方法?相信很多人對(duì)javascript的對(duì)象繼承方法的了解處于一知半解狀態(tài),小編給大家總結(jié)了以下內(nèi)容。如下資料是關(guān)于javascript的對(duì)象繼承方法的內(nèi)容。

1原型鏈繼承
所有的javascript 都會(huì)繼承一個(gè)prototype原型對(duì)象  繼承原型對(duì)象上的屬性和方法。
例如:
date  對(duì)象  從Date.prototype 原型對(duì)象上繼承屬性和方法
array 對(duì)象  從Array.prototype  原型對(duì)象上繼承屬性和方法
要繼承  必須有父類  ----子類繼承父類  繼承父類的屬性和方法

特點(diǎn):實(shí)例可以繼承自身實(shí)例的屬性   父類里面的構(gòu)造函數(shù)屬性  父類的原型屬性
缺點(diǎn):不能繼承子類的原型屬性和方法
太單一   只能單繼承  不能進(jìn)行多繼承
繼承之后原型對(duì)象上的屬性全部是共享的
子類不能直接向父類傳遞參數(shù)

function Person() {
        this.name;
        this.sex;
        this.sleep = function () {
            return "睡覺(jué)";
        };
        this.eat = function () {
            return "吃飯"
        }
    }
        //給父類添加原型屬性和方法
    Person.prototype.job = function () {
        return "工作";
    };
    Person.prototype.color = "黃";
        function Child() {
        this.age = 20;
    }
        Child.prototype = new Person();  //核心   讓子類的原型 等于 父類的實(shí)例對(duì)象
         var child = new Child();
         console.log(Child.prototype);//繼承之后指向Person  對(duì)象
          console.log(child instanceof Child);  ///true
    console.log(child instanceof Person);  //true

2構(gòu)造函數(shù)
直接使用call  apply  繼承
構(gòu)造繼承直接在子類的內(nèi)部去寫(xiě)
優(yōu)點(diǎn):  可以實(shí)現(xiàn)多繼承;可以向父類傳遞參數(shù)
缺點(diǎn):  子類的實(shí)例是本身 不是父類;構(gòu)造繼承只能call  apply  父類對(duì)象的構(gòu)造屬性和方法  不能復(fù)制原型屬性和方法

 //父類
    function Animail(s, a) {
        this.sex = s;
        this.age = a;
        this.sleep = function () {
            return "睡覺(jué)";
        }
    }
    //Animal  添加原型屬性
    Animail.prototype.color = "花色";
    //動(dòng)物類別類
    function Type(t) {
        this.type = t;
    }
    //子類
    function Cat(n, s, a, t) {
        this.name = n;
        this.eat = function () {
            return "吃東西"
        }
        Animail.call(this, s, a);
        Type.apply(this, [t]);
    }

    //實(shí)例化子類對(duì)象
    var cat = new Cat("小貓", "公", 2, "貓科");  //類對(duì)象在實(shí)例化的時(shí)候會(huì)直接執(zhí)行自身的構(gòu)造函數(shù)
    console.log(cat);
        /檢測(cè)構(gòu)造繼承里面的類別問(wèn)題
    console.log(cat instanceof Cat);//true
    console.log(cat instanceof Animail);//false
    console.log(cat instanceof Type);//false

3實(shí)例繼承
原理是在子類里面直接構(gòu)造父類的實(shí)例
優(yōu)點(diǎn):可以傳遞給父類參數(shù)    不限制調(diào)用的方式
缺點(diǎn):不能多繼承;不能拿到子類的構(gòu)造屬性和方法
實(shí)例繼承 子類的實(shí)例不是本身而是父類

 //父類
    function Person(n, s) {
        this.name = n;
        this.sex = s;
        this.sleep = function () {
            console.log(this.name + "睡覺(jué)");
        }
    }
    //子類
    function Child(n, s) {
        var per = new Person(n, s);
        return per;
    }
    //實(shí)例化子類對(duì)象
    var child = new Child("張三", "女");
         console.log(child instanceof Child);//false
    console.log(child instanceof Person);//true

4拷貝繼承
原理是 將父類里面的屬性方法拷貝給子類
子類的實(shí)例是本身  不是父類
子類向父類傳遞參數(shù)
可以支持多繼承

function Animal(n) {
        this.name = n;
        this.sleep = function () {
            return this.name + "睡覺(jué)"
        }
    }
    function Cat(n, a) {
        this.age = a;
        //拷貝
        var animal = new Animal(n);
        for (var p in animal) {
            Cat.prototype[p] = animal[p];
        }
        //繼續(xù)new 別的對(duì)象  進(jìn)行拷貝
    }
    /* Cat.prototype.name="";
     Cat.prototype.sleep=function (){

     };*/
    //實(shí)例化子類
    var cat = new Cat("小花", 3);
    console.log(cat);
         console.log(cat instanceof Cat);//true
    console.log(cat instanceof Animal);//false

5組合繼承
構(gòu)造繼承+原型鏈繼承
子類的實(shí)例即是本身也是父類
沒(méi)有原型對(duì)象屬性的共享
實(shí)現(xiàn)多繼承
調(diào)用了兩次父類的構(gòu)造函數(shù)

    function Person(n) {
        this.name = n;
        this.sleep = function () {
            return this.name + "睡覺(jué)";
        }
    }
    Person.prototype = {
        job: function () {
            return this.name + "job";
        }
    }

    function Child(n, a, s) {
        this.age = a;
        this.sex = s;
        //構(gòu)造繼承
        Person.call(this, n);
    }
    //原型鏈繼承
    Child.prototype = new Person();
    var child = new Child("張三", 18, "男");
        console.log(child);
        console.log(child instanceof Child); //true
    console.log(child instanceof Person);//true

6寄生組合繼承
是處理組合繼承的缺點(diǎn)  避免兩次調(diào)用父類的構(gòu)造函數(shù)
原理是把父類的原型給予一個(gè)空對(duì)象的原型
子類對(duì)象的實(shí)例即是本身也是父類

function Person(n) {
        this.name = n;
        this.sleep = function () {
            return this.name + "睡覺(jué)";
        }
    }
    console.log(Person.prototype);

    function Child(n, a) {
        this.age = a;
        this.eat = function () {
            return this.name + "吃飯"
        }
        Person.call(this, n);
    }
    //寄生
    (function () {
        var fn = function () {
        };
        //將父類的原型對(duì)象給予空對(duì)象
        fn.prototype = Person.prototype;
        Child.prototype = new fn();
    })();

    var child = new Child("李四", 20);
    console.log(child);
        console.log(child instanceof Child); //true
    console.log(child instanceof Person); //true

關(guān)于javascript的對(duì)象繼承的方法就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果喜歡這篇文章,不如把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI