1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
     
    <title>My JSP 'oop7.jsp' starting page</title>
     
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
    <script type="text/javascript">
        //实现只继承父类的原型对象
        function extend(Sub,Sup){
            //1.用一个空函数进行中转
            //穿件一个空函数,目的:中转
            var F=new Function();
            F.prototype=Sup.prototype;      //实现空函数的原型对象和超类的原型对象转换
            Sub.prototype=new F();          //原型继承
            Sub.prototype.constructor=Sub;  //还原子类的构造器
            //保存父类的原型对象     1.方便解耦   2.可以方便获得分类的原型对象
            Sub.superClass=Sup.prototype;        //自定义一个子类的静态属性,接收父类的原型对象
            if(Sup.prototype.constructor==Object.prototype.constructor){
                Sup.prototype.constructor=Sup;   //手动还原父类原型对象的构造器
            }
        }
         
         
         
         
         
         
         
         
         
        //混合继承:原型继承+构造函数继承
        function Person(name,age){
            this.name=name;
            this.age=age;
             
        }
         
        Person.prototype={
            constructor:Person,
            sayName:function(){
                alert(this.name);
            }
        }
         
        function Boy(name,age,sex){
            Boy.superClass.constructor.call(this,name,age);          //绑定父类的模板函数,借用构造,支复制了父类的模板
            this.sex=sex;
        }
         
        //Boy.prototype=new Person();    //既继承了父类的模板,又继承了父类的原型,但由于不习惯于在new Person时传入参数,所以会再使用call函数继承模板
        extend(Boy,Person);
        //给子类加上一个父类的覆盖方法
        Boy.prototype.sayName=function(){
            alert('子类复写方法');
        }
        var b=new Boy('张三',23,'男');
        alert(b.sex);
        b.sayName();
        Boy.superClass.sayName.call(b);     //调用父类的同名函数
         
        //3件事
        //混合继承缺点:继承了两次父类的模板,一次父类的原型对象
         
         
         
        //2集成一次父类的模板,一次父类的原型对象
        //只继承一遍父类的模板      自定义方法实现只继承一遍父类的模板extend方法
         
         
    </script>
  </head>
   
  <body>
    This is my JSP page. <br>
  </body>
</html>