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 属性会构成一条链,称为原型链,顺着隐藏的原型链,实例可以顺利指向基类对象。