原型--->_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();//搞破壞
為了資料共享,改變原型指向,做到了繼承---通過改變原型指向實作的繼承
注意缺陷:因為改變原型指向的同時實作繼承,直接初始化了屬性,繼承過來的屬性的值都是一樣的了,是以,這就是問題隻能重新調用對象的屬性進行重新指派