Javascript继承
源码下载对象冒充的方法
把多个对象共同的属性抽象出来,构建一个基类构造函数,通过案例中第18行第19行代码,可以把基类函数集成到子类对象,第32行调用时就会把积累中的所有属性复制下来。
9 //基类(霍去病、岳飞共同的属性) 10 function Base(){ 11 this.nation = "汉"; 12 this.country = "中国"; 13 this.job = "军人"; 14 } 15 16 //huo构造函数 17 function huo() { 18 this.fun = Base;//通过基类构造函数的函数名Base把构造函数传递给fun属性 19 this.fun();//执行函数fun,new操作时,所得基类所有属性 20 this.name = "霍去病"; 21 this.dynasty = "汉"; 22 } 23 24 //yue构造函数 25 function yue() { 26 this.fun = Base; 27 this.fun(); 28 this.name = "岳飞"; 29 this.dynasty = "宋"; 30 } 31 32 let extend1 = new huo(); 33 let extend2 = new yue(); 34 //页面显示对象extend1的dynasty属性值 35 document.write(extend1.dynasty); 36 document.write("<br>"); 37 //页面显示对象extend2的country属性值 38 document.write(extend2.country); 39 document.write("<br>");
原型链
prototype连续传递,这种方法子类也可以继承基类的属性。
9 //基类(霍去病、岳飞共同的属性) 10 function Base(){ 11 } 12 Base.prototype.nation = "汉"; 13 Base.prototype.country = "中国"; 14 Base.prototype.job = "军人"; 15 16 17 //huo构造函数 18 function huo() { 19 this.name = "霍去病"; 20 this.dynasty = "汉"; 21 } 22 huo.prototype = new Base();//引入基类包含的属性 23 24 25 //yue构造函数 26 function yue() { 27 this.name = "岳飞"; 28 this.dynasty = "宋"; 29 } 30 yue.prototype = new Base();//引入基类包含的属性 31 32 33 //new操作构造函数,创建两个对象 34 let extend1 = new huo(); 35 let extend2 = new yue(); 36 //页面显示对象extend1的dynasty属性值 37 document.write(extend1.dynasty); 38 document.write("<br>"); 39 //页面显示对象extend2的country属性值 40 document.write(extend2.country); 41 document.write("<br>");
prototype是每一个构造函数都有的属性,当你调用第34行定义的对象时,比如let x = extend1.nation;这时候程序首先会在extend1的对象里面查找自己的属性,查看第26行构造函数的代码可以知道,没有nation属性,这时候程序 会通过prototype指针跳转到第十行代码定义的基类Base里面查找属性nation,查找到后,把属性值赋值给x变量。
基类
前面的课程讲解过类和实例的概念,本节课引入基类的概念,类是是对实际变成规律的抽象,多各类也可以继续抽象出一个新的类。父对象有子对象,对象嵌套对象,对于类也一样。 以上面“对象冒充的代码为例”,霍去病和岳飞共同的特征是民族汉人、国籍中国、职业军人,这可以抽象为一个类,就是第10到第14行定义的代码,这两位人物也都有自己的特征,又分别创建了两个构造函数 第17行的huo(),第25行的yue(),这两个构造函数里面都利用语句this.fun = Base;把他们的共同特征引入。huo()和yue()两个构造函数成为类,那么么构造函数Base就是基类或者称为父类,实际的工程中,可能涉及到 多层类,一个类相比一个类是父类,相比另一个类可能就是子类。引入关键字prototype作为构造函数的特殊属性,正式为了完成子类对基类属性和方法的继承,使用prototype的好处就是,基类可以作为占用一块内存, 然后被实例化的对象,无限制引用,如果不通过关键字prototype实现继承,那么每创建一个实例,就要把基类中的内容复制一遍,浪费内存。每一层类都有一个prototype属性,这个属性相当于一个指针,所有类的prototype 属性会构成一条链,称为原型链,顺着隐藏的原型链,实例可以顺利指向基类对象。