原型--->_proto_或者prototype都是原型对象
【1】实例对象中有个属性,_proto_,也是对象,叫原型,不是标准的属性,浏览器使用的(每个浏览器的支持不同,导致结果不同,所以不标准)
【2】构造函数中有一个属性,prototype,也是对象,叫原型,是标准属性,程序员使用
原型的作用:共享数据,节约内存空间
构造函数、prototype、__proto__三者之间的关系
原型链:是一种关系,实例对象和原型对象之间的关系,是通过原型(__proto__)来联系的
【1】构造函数可以实例化对象
【2】构造函数中有一个属性叫prototype,是构造函数的原型对象
【3】构造函数的原型对象(prototype)中有一个constructor构造器,这个构造器,指向的就是之间所在的原型对象所在的构造函数
【4】实例对象的原型对象(__proto__)指向的是该构造函数的原型对象
【5】构造函数的原型对象(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();//搞破坏
为了数据共享,改变原型指向,做到了继承---通过改变原型指向实现的继承
注意缺陷:因为改变原型指向的同时实现继承,直接初始化了属性,继承过来的属性的值都是一样的了,所以,这就是问题只能重新调用对象的属性进行重新赋值