天天看点

原型:_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();//搞破坏

为了数据共享,改变原型指向,做到了继承---通过改变原型指向实现的继承

注意缺陷:因为改变原型指向的同时实现继承,直接初始化了属性,继承过来的属性的值都是一样的了,所以,这就是问题只能重新调用对象的属性进行重新赋值