天天看點

原型:_proto_或者prototype都是原型對象原型實作繼承

原型--->_proto_或者prototype都是原型對象

【1】執行個體對象中有個屬性,_proto_,也是對象,叫原型,不是标準的屬性,浏覽器使用的(每個浏覽器的支援不同,導緻結果不同,是以不标準)

【2】構造函數中有一個屬性,prototype,也是對象,叫原型,是标準屬性,程式員使用

原型的作用:共享資料,節約記憶體空間

構造函數、prototype、__proto__三者之間的關系

原型鍊:是一種關系,執行個體對象和原型對象之間的關系,是通過原型(__proto__)來聯系的

【1】構造函數可以執行個體化對象

【2】構造函數中有一個屬性叫prototype,是構造函數的原型對象

【3】構造函數的原型對象(prototype)中有一個constructor構造器,這個構造器,指向的就是之間所在的原型對象所在的構造函數

【4】執行個體對象的原型對象(__proto__)指向的是該構造函數的原型對象

【5】構造函數的原型對象(prototype)中的方法是可以被執行個體對象直接通路的

原型:_proto_或者prototype都是原型對象原型實作繼承

原型指向可以改變

執行個體對象的原型__proto__指向的是該對象所在的構造數的原型對象

構造函數的原型對象(prototype)指向如果改變了,執行個體對象的原型(__proto__)指向也會發生改變

function Po(btnobj, dvobj, json) {

            this.btnobj = btnobj;

            this.dvobj = dvobj;

            this.json = json;

        }

        Po.prototype.eat = function () {

            console.log("吃飯啦!!");

        }

        Po.prototype.num = 100;

        var p = new Po("hhh", 12, 12);

        function Re(btn, dv) {

            this.btn = btn;

            this.dv = dv;

        }

        Re.prototype.paly = function () {

            console.log("打籃球!!");

        }

//Re構造函數指向Po,那麼Re的共享資料無法擷取,隻能擷取Po的共享資料

        Re.prototype = new Po("hhh", 12, 12);

        console.dir(Re);

        console.dir(Re);

原型實作繼承

構造函數名.prototype.方法/屬性

當通過new的方式執行個體化對象時,就是建立了新的對象,這個對象同時也繼承了它的構造函數的原型對象

        //動物有名字,有體重,有吃東西的行為

        //小狗有名字,有體重,有毛色, 有吃東西的行為,還有咬人的行為

        //哈士奇名字,有體重,有毛色,性别, 有吃東西的行為,還有咬人的行為,逗主人開心的行為

        //動物的構造函數

        function Animal(name, weight) {

            this.name = name;

            this.weight = weight;

        }

        //動物的原型的方法

        Animal.prototype.eat = function () {//吃東西

            console.log("天天吃東西,就是吃");

        };

        //狗的構造函數

        function Dog(color) {

            this.color = color;

        }

        Dog.prototype = new Animal("哮天犬", "50kg");

        Dog.prototype.bitePerson = function () {//咬人

            console.log("哼~汪汪~咬死你");

        };

        //哈士奇

        function ErHa(sex) {

            this.sex = sex;

        }

        ErHa.prototype = new Dog("黑白色");

        ErHa.prototype.playHost = function () {//搞破壞

            console.log("哈哈~要壞衣服,要壞桌子,拆家..嘎嘎...好玩,開心不,驚喜不,意外不");

        };

        var erHa = new ErHa("雄性");

        console.log(erHa.name, erHa.weight, erHa.color);

        erHa.eat();//吃東西

        erHa.bitePerson();//咬人

        erHa.playHost();//搞破壞

為了資料共享,改變原型指向,做到了繼承---通過改變原型指向實作的繼承

注意缺陷:因為改變原型指向的同時實作繼承,直接初始化了屬性,繼承過來的屬性的值都是一樣的了,是以,這就是問題隻能重新調用對象的屬性進行重新指派