原型 继承
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title></title> 6 <script> 7 8 //继承: 子类继承父类的属性和方法 9 //子类, 父类, 10 11 //类(构造函数) 12 //IPod: 属性:color, 方法:listenMusic 13 //IPad: 属性:color,type, 方法:listenMusic,playKingOfHonor 14 //IPhone: 属性:color, type, size 方法: listenMusic,playKingOfHonor,call 15 16 //父类 17 function IPod(){ 18 this.color = "黑色"; 19 this.listenMusic = function(){ 20 console.log("听音乐"); 21 } 22 } 23 24 //子类 25 function IPad(){ 26 this.type = "iPad Air"; 27 this.playKingOfHonor = function(){ 28 console.log("玩王者荣耀"); 29 } 30 31 } 32 IPad.prototype = new IPod(); //原型链继承, 继承父类IPod 33 34 //ipad对象 35 var ipad = new IPad(); 36 console.log(ipad.color + "," + ipad.type); //黑色,iPad Air 37 ipad.playKingOfHonor(); 38 ipad.listenMusic(); //听音乐 39 40 41 //孙子类 42 function IPhone(){ 43 this.size = "5.5寸"; 44 this.call = function(){ 45 console.log("打电话"); 46 } 47 } 48 IPhone.prototype = new IPad(); //继承父类IPad 49 50 //iphone对象 51 var iphone = new IPhone(); 52 console.log(iphone.size); //5.5寸 53 console.log(iphone.type); //iPad Air 54 console.log(iphone.color); //黑色 55 iphone.call(); 56 iphone.playKingOfHonor(); 57 iphone.listenMusic(); 58 59 console.log(iphone instanceof IPhone); //true 60 console.log(iphone instanceof IPad); //true 61 console.log(iphone instanceof IPod); //true 62 console.log(iphone instanceof Object); //true 63 64 console.log(ipad instanceof IPhone); //false 65 console.log(ipad instanceof IPad); //true 66 console.log(ipad instanceof IPod); //true 67 console.log(ipad instanceof Object); //true 68 69 70 71 72 </script> 73 </head> 74 <body> 75 </body> 76 </html>
练习
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title></title> 6 <script> 7 8 /* 9 2, 练习 10 实现以下类的原型链继承 11 父类:Cat 12 方法: eat; miaow 13 属性: fur 14 说明: eat吃各种东西 15 16 子类1: GarfieldCat 17 方法:eat; miaow; talk 18 属性:fur; glasses 19 说明:eat只吃肉 20 21 子类2: TomCat 22 方法:eat; miaow; catchMouse 23 属性:fur; friend 24 说明:eat只吃面包 25 26 * */ 27 28 //父类:Cat 29 function Cat(){ 30 this.fur = "黑色的皮"; 31 this.miaow = function(){ 32 console.log("喵喵"); 33 } 34 this.eat = function(){ 35 console.log("吃各种东西"); 36 } 37 } 38 39 //子类1: GarfieldCat 40 function GarfieldCat(){ 41 this.glasses = "眼镜"; 42 this.talk = function(){ 43 console.log("可以说话"); 44 } 45 this.eat = function(){ 46 console.log("只吃肉"); 47 } 48 } 49 GarfieldCat.prototype = new Cat(); //继承Cat 50 //实例对象 51 var garfieldCat = new GarfieldCat(); 52 garfieldCat.eat(); //只吃肉 53 54 //子类2: TomCat 55 function TomCat(){ 56 this.friend = "Jerry"; 57 this.catchMouse = function(){ 58 console.log("抓老鼠"); 59 } 60 this.eat = function(){ 61 console.log("吃面包"); 62 } 63 } 64 TomCat.prototype = new Cat(); //继承Cat 65 66 67 </script> 68 </head> 69 <body> 70 </body> 71 </html>
对象冒充 ,call() apply()
共同点:都可以用来代替另一个对象调用一个方法,可以改变this的指向
不同点:功能一样传入参数的形式不一样。add.apply(sub,[4,2]) add.call(sub,4,2)
组合继承 原型链 + 对象冒充
原型链:继承方法
对象冒充:继承属性
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script> //对象冒充,借用构造函数 //call()/apply() //构造函数 function Person(_name, _age){ //console.log(_name + "," + _age); this.name = _name; this.age = _age; this.run = function(){ console.log("跑步"); } } Person.prototype.sex = "男"; //构造函数 function Man(_name1, _age1){ //this = man //对象冒充 Person.call(this, _name1, _age1); //继承Person //Person.apply(this, [_name1, _age1]); //this.name = _name1; //this.age = _age1; } //man对象 var man = new Man("张三", 33); console.log(man.name); //张三 console.log(man.age); //33 console.log(man.sex); //undefined, 不能继承父类原型中的属性和方法 man.run(); //跑步 /* //IPad //父类 function IPad(_color, _type){ this.color = _color; this.type = _type; this.playLOL = function(){ console.log("玩LOL"); } } //IPhone //子类 function IPhone(_color, _type, _size){ //对象冒充 IPad.call(this, _color, _type); this.size = _size; this.call = function(){ console.log("打电话"); } } var iphone7 = new IPhone("骚红色", "iphone7", "5.5寸"); console.log(iphone7.color); console.log(iphone7.type); console.log(iphone7.size); iphone7.playLOL(); iphone7.call(); */ //组合继承 //原型链继承: 继承方法 //对象冒充:继承属性 //IPad //父类 function IPad(_color, _type){ this.color = _color; this.type = _type; } IPad.prototype.playLOL = function(){ console.log("玩LOL"); } //IPhone //子类 function IPhone(_color, _type, _size){ IPad.call(this, _color, _type); //对象冒充继承父类IPad的属性 this.size = _size; } IPhone.prototype = new IPad(); //原型链继承父类的方法 IPhone.prototype.call = function(){ console.log("可以打电话"); } //实例对象 var iphone8 = new IPhone("亮黑色", "iphone8", "5.5寸"); console.log(iphone8.color); console.log(iphone8.type); console.log(iphone8.size); iphone8.playLOL(); iphone8.call(); </script> </head> <body> </body> </html>
练习
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script> /* 2, 练习:使用组合继承的方式实现以下类的继承 父类:Cat 方法: eat; 属性: fur 说明: eat吃各种东西 子类: TomCat 方法:eat; catchMouse 属性:fur; friend 说明:eat只吃面包 * */ //父类 function Cat(_fur){ this.fur = _fur; } Cat.prototype.eat = function(){ console.log("吃各种东西"); } //子类 function TomCat(_fur, _friend){ Cat.call(this,_fur); //对象冒充继承父类的属性 this.friend = _friend; } TomCat.prototype = new Cat(); //原型链继承父类的方法 TomCat.prototype.catchMouse = function(){ console.log("抓老鼠"); } TomCat.prototype.eat = function(){ console.log("吃面包"); } var tomcat = new TomCat("有皮毛", "有盆友"); console.log(tomcat.fur); console.log(tomcat.friend); tomcat.catchMouse(); tomcat.eat(); </script> </head> <body> </body> </html>